回溯
分为交换法和标记数组法
- 交换法就是交换first指向的那个值和i指向的那个值,使得[0,first]始终是已经遍历完毕填入数组的,[first+1,len-1]始终是待遍历的
交换法-官方题解 - 标记数组法就是设置一个Boolean类型的数组used,全部初始化为false,used[i]代表第i个数字还未被使用,若used[i]=false则填入数组,接着将其置为true,若used[i]=true代表已经被使用则跳过,在一次完整遍历结束后将used重新置为false
标记数组法-很详细
// 交换法代码
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<vector<int>> permute(vector<int>& nums) {
int len=nums.size();
dfs(nums,len,0);
return res;
}
void dfs(vector<int>& nums,int len,int begin){
if(begin==len){
res.push_back(nums); // 遍历完成,push进res数组中
return;
}
for(int i=begin;i<len;i++){
swap(nums[i],nums[begin]); // 交换
dfs(nums,len,begin+1);
swap(nums[i],nums[begin]); // 递归完成,撤回交换
}
}
};