46. 全排列
LeetCode刷题打卡第029天 (第1篇) 20210807
代码1
1. 运用回溯法模板的代码
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
2. 具体代码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > ans; //返回的答案值
vector<bool> used(nums.size(),false);
vector<int > path; //记录路径
backtracking(nums,ans,used,path);
return ans;
}
void backtracking(vector<int> &nums,vector<vector<int> >&ans,vector<bool> &used,vector<int> path){
if(path.size()==nums.size()){
ans.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(used[i])//说明已经进入过path中
continue;
else{
used[i]=true;
path.push_back(nums[i]);
backtracking(nums,ans,used,path);
used[i]=false;
path.pop_back();
}
}
}
};
代码2
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > ans;
backtrack(nums,0,ans); //传递参数,代表第0层
return ans;
}
void backtrack(vector<int> &nums,int depth,vector<vector<int> >&ans){
if(depth==nums.size()) { //根据回溯的知识,可以得当触底时进行返回
ans.push_back(nums);
return;
}
for(int i=depth;i<nums.size();i++){
swap(nums[i],nums[depth]);
backtrack(nums,depth+1,ans);
swap(nums[i],nums[depth]);
}
}
};