回溯法实现全排列
我们从下标first=0开始排列,假设整数个数为n:
- 如果第一个位置达到了索引n,意味着当前排列已完成。
- 遍历索引first到索引n-1的所有整数
在排列中放置第i个整数,即swap(num[first],num[i])
继续生成从第i个整数开始的所有排列:backtrack(first+1);
现在回溯,即通过swap(num[first],num[i])还原。
代码实现:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
backtrack(nums,res,0);
return res;
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void backtrack(vector<int> &nums,vector<vector<int>> &res,int i){
if(i==nums.size())
res.push_back(nums);
for(int j=i;j<nums.size();j++){
swap(nums[i],nums[j]);
backtrack(nums,res,i+1);
swap(nums[i],nums[j]);
}
}