[Leetcode46]全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

这道题难度相对有点大。看到这道题我想到的是能否找一个一劳永逸的办法,我想到了递归的解法,不得不说递归的解法把我头都绕晕了,所以最后我还是用了最暴力的解法一个个排列组合找出来,而没有像网上那样其他各种牛逼的算法。我用python写的逻辑是每一种排列组合从第一个数开始依次压入列表,中间加入了判断是否重复的语句减少不必要的内存。好在python里的not in操作很方便。

python:

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        for i in range(len(nums)):
            res.append([nums[i]])
        for flag in range(1,len(nums)):
            temp = []
            for i in range(len(res)):
                resTemp = res[i]
                for j in range(len(nums)):
                    if nums[j] not in resTemp:
                        resTemp.append(nums[j])
                        temp.append(list(resTemp))
                        resTemp.pop(-1)
            res = list(temp)
        return res

C++我作弊了,用了STL库里<algorithm>里的next_permutation函数,因为我将python里的做法搬到C++抛出内存超出限制的问题。这道题最好还是要用递归的思想去做,开销可能会大点,以后有时间再好好琢磨这道题,挺有意思的。目前先完成论文再说哈哈哈

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        res.push_back(nums);
        while(next_permutation(nums.begin(),nums.end())){
            vector<int> temp;
            for(int i = 0;i < nums.size();i++){
                temp.push_back(nums[i]);
            }
            res.push_back(temp);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40501689/article/details/82959748
今日推荐