46.全排列
这个题就不用startindex每次从那个数之后选择了,每次都是从最开始选择, 但是每次for循环选过的数字还是要删掉,所以加了下面这句删除
if(used[i] == true) //所以这个垂直方向已经取过得数字也会进去for循环,但是会被直接跳过去;这样的话就不需要startindex,i可以从0开始,然后每次可以通过这个used把已经遍过得数字给人为的去掉;
{continue;}
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>&nums, vector<bool>&used){
if(path.size() == nums.size()){
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(used[i] == true) //所以这个垂直方向已经取过得数字也会进去for循环,但是会被直接跳过去;这样的话就不需要startindex,i可以从0开始,然后每次可以通过这个used把已经遍过得数字给人为的去掉;
{continue;}
path.push_back(nums[i]);
used[i] =true;
backtracking(nums,used);
path.pop_back();
used[i] =false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtracking(nums,used);
return result;
}
};
47.全排列 II
这个题也是前面那个题和树层去重的缝合问题;used数组又要和上面那个题一样用来去掉本层已经选过的元素,又要用来排除重复的组合
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, vector<bool>&used){
if(path.size() == nums.size()){
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) //因为操作了i-1所以要确保i>0
{continue;}
if(used[i] == false){
path.push_back(nums[i]);
used[i] =true;
backtracking(nums,used);
path.pop_back();
used[i] =false;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool> used(nums.size(),false);
sort(nums.begin(), nums.end());
backtracking(nums,used);
return result;
}
};