leetcode 46.全排列
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums,vector<bool>& used){//1.确定函数的参数和返回值
if(path.size()==nums.size()){//2.确定递归的终止条件
result.push_back(path);
return ;
}
//3.确定递归的单层逻辑
for(int i=0;i<nums.size();i++){
if(used[i]==false){//处理
path.push_back(nums[i]);
used[i]=true;
}else{
continue;
}
backtracking(nums,used);//递归
used[i]=false;//回溯
path.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
path.clear();
result.clear();
vector<bool> used(nums.size(),false);
backtracking(nums,used);
return result;
}
};
注意:
- 全排列问题中收集的结果为叶子结点,因此我们往result里面push的时候需要判断当前是否递归到了叶子结点,即判断path.size==num.size();
- 因为是
全
排列问题,每次遍历都需要从0开始遍历,没有了startIndex我们如何保证之前遍历过的元素不会再被遍历呢,用used数组判断我们是否处理过这个元素,如果是false才会处理,true的话就不处理,直接continue到该层的下一个元素。 - 这里used数组去重不可以用startIndex去重方法替代,因为本题全排列问题中的去重和子集II问题中的去重并不相同;