链接
参考
思路
回溯法。
分别取nums中的所有元素放进temlist中,然后把(nums去掉这个元素的副本)传给递归函数,继续进行。当nums长度为0时说明都取尽了。
code
python
class Solution:
def permute(self, nums) :
List = []
def backtrack(List, nums, temList):
if len(nums) == 0:
List.append(temList.copy())
for i in range(len(nums)):
temList.append(nums[i])
tem = nums[i]
nums_tem = nums.copy()
del nums_tem[i]
backtrack(List, nums_tem, temList)
temList.pop()
temList = []
backtrack(List, nums, temList)
return List
附上别人写的
for(let i = 0; i < nums.length; i++) {
if (tempList.includes(nums[i])) continue;
tempList.push(nums[i]);
backtrack(list, tempList, nums);
tempList.pop();
}
上面这个的思路就是,如果temlist中有这个元素了,就跳过,换下一个。也是一种方法吧。
c++
和python不同,这里注意要传引用,否则不能改变List
class Solution {
public:
void backtrack(vector<vector<int>>&List, vector<int>nums, vector<int>temlist){
if(nums.size() == 0){
List.push_back(temlist);
}
for(int i = 0; i < nums.size(); i++){
temlist.push_back(nums[i]);
vector<int> V(nums); //复制nums给V
V.erase(V.begin() + i);//删除nums[i]
backtrack(List, V, temlist);
temlist.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> List;
vector<int> temlist;
backtrack(List, nums, temlist);
return List;
}
};