给定一个没有重复数字的序列,返回其所有可能的全排列。
这道题难度相对有点大。看到这道题我想到的是能否找一个一劳永逸的办法,我想到了递归的解法,不得不说递归的解法把我头都绕晕了,所以最后我还是用了最暴力的解法一个个排列组合找出来,而没有像网上那样其他各种牛逼的算法。我用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;
}
};