LeetCode/全排列
给定一个不含重复数字的数组nums,返回其所有可能的全排列,你可以按任意顺序返回答案
回溯法
思路:每次选一个,转移到下一空间,考虑用回溯思想,遍历可选数,递归每一位,当最后一位选取结束时记录结果
粗糙写法
class Solution {
public:
vector> res;
int len;
unordered_set sets;
vector> permute(vector& nums) {
vector num;
len=nums.size();
backtrack(nums,num,0);
return res;
}
void backtrack(vector& nums,vector& num,int index){
if(index==len){
res.push_back(num);
return;
}
for(int i=0;i0) continue;
num.push_back(nums[i]);
sets.insert(nums[i]);
backtrack(nums,num,index+1);
num.pop_back();
sets.erase(nums[i]);
}
}
};
优化写法
class Solution {
public:
vector> res;
vector> permute(vector& nums) {
vector num;
backtrack(nums,num);
return res;
}
void backtrack(vector& nums,vector& num)
{
if(num.size()==nums.size()){
res.push_back(num);
return;
}
for(int i=0;i
官方无敌写法
class Solution {
public:
vector> permute(vector& nums) {
vector > res;
backtrack(res, nums, 0, (int)nums.size());
return res;
}
void backtrack(vector>& res, vector& output, int first, int len){
// 所有数都填完了
if (first == len) {
res.emplace_back(output);
return;
}
for (int i = first; i < len; ++i) {
// 动态维护数组
swap(output[i], output[first]);
// 继续递归填下一个数
backtrack(res, output, first + 1, len);
// 撤销操作
swap(output[i], output[first]);
}
}
};