491.递增子序列
题目:力扣
class Solution {
public:
vector<vector<int>> result;
vector<int> ans;
void backtracking(vector<int>&nums,int start){
if(ans.size() >= 2){
if(ans[ans.size()-1] < ans[ans.size()-2]){
return;
}
result.push_back(ans);
}
//每一层加一个去重数组,不能直接排序了
unordered_set<int> used;
for(int i = start; i < nums.size(); ++i){
if(i > start && used.find(nums[i]) != used.end()) continue;
ans.push_back(nums[i]);
used.insert(nums[i]);
backtracking(nums,i+1);
ans.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
46.全排列
题目:力扣
class Solution {
public:
vector<vector<int> > resulut;
vector<int> ans;
unordered_set<int> used;
void backtracking(vector<int>& nums){
if(ans.size() == nums.size()){
resulut.push_back(ans);
return;
}
for(int i = 0; i < nums.size(); ++i){
if(used.find(nums[i]) != used.end()) continue;
ans.push_back(nums[i]);
used.insert(nums[i]);
backtracking(nums);
ans.pop_back();
used.erase(nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
backtracking(nums);
return resulut;
}
};
47.全排列 II
题目:力扣
class Solution {
public:
vector<vector<int> > resulut;
vector<int> ans;
unordered_set<int> used;
void backtracking(vector<int>& nums){
if(ans.size() == nums.size()){
resulut.push_back(ans);
return;
}
unordered_set<int> used2;
for(int i = 0; i < nums.size(); ++i){
if(used2.find(nums[i]) != used2.end()) continue;
if(used.find(i) != used.end()) continue;
ans.push_back(nums[i]);
used.insert(i);
used2.insert(nums[i]);
backtracking(nums);
ans.pop_back();
used.erase(i);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
backtracking(nums);
return resulut;
}
};
总结
题型:递增子序列,全排列
技巧:用好去重数组