78.子集
画图分析:
思路:横向遍历,每次遍历的时候都进行一次添加,然后进行纵向递归,递归完之后进行回溯。
90.子集||
分析:和上题一样,区别在于有重复数字
思路:组合问题有重复都考虑先排序再操作!
class Solution {
public:
vector<vector<int>>res;
vector<int>mid;
void backtrace(vector<int>&nums,int start){
if(find(res.begin(),res.end(),mid)==res.end())//去重
res.push_back(mid);
if(start==nums.size())
return;
for(int i=start;i<nums.size();i++){
mid.push_back(nums[i]);
backtrace(nums,i+1);
mid.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());//需要排序
backtrace(nums,0);
return res;
}
};
491.递增子序列
class Solution {
public:
vector<vector<int>>midRes,res;
vector<int>mid;
void backtrace(vector<int>&nums,int start){
if(mid.size()>=2 ){//条件限制
midRes.push_back(mid);
}
if(start==nums.size())//终止条件
return;
unordered_set<int> vistedSet;
for(int i=start;i<nums.size();i++){
if(vistedSet.find(nums[i])!=vistedSet.end())//去重
continue;
if(!mid.empty() && mid.back()>nums[i])//递增条件
continue;
//judge[nums[i]]=true;
vistedSet.insert(nums[i]);//遍历标记
mid.push_back(nums[i]);
backtrace(nums,i+1);
mid.pop_back();//回溯
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtrace(nums,0);
return midRes;
}
};
46.全排列
思路:跟子集的代码几乎一样,主要区别在于
class Solution {
public:
vector<vector<int>>res;
vector<int>mid;
void backtrace(vector<int>&nums,int start){
if(start==nums.size()){
res.push_back(mid);
}
for(int i=0;i<nums.size();i++){
if(find(mid.begin(),mid.end(),nums[i])!=mid.end())//树枝去重
continue;
mid.push_back(nums[i]);
backtrace(nums,start+1);
mid.pop_back();
}
}
//树枝去重
vector<vector<int>> permute(vector<int>& nums) {
backtrace(nums,0);
return res;
}
};
47.全排列||
思路一:使用哈希表进行树枝下标去重(因为有重复元素)
问题:在数组去重时时间复杂度过高
class Solution {
public:
vector<vector<int>>res;
vector<int>mid;
unordered_map<int,bool>map;
void backtrace(vector<int>&nums,int start){
if(start==nums.size()){
if(find(res.begin(),res.end(),mid)==res.end())//数组去重
res.push_back(mid);
return;
}
for(int i=0;i<nums.size();i++){
if(map[i])//树枝去重
continue;
mid.push_back(nums[i]);
map[i]=true;
backtrace(nums,start+1);
mid.pop_back();
map[i]=false;
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
//sort(nums.begin(),nums.end());
backtrace(nums,0);
return res;
}
};