2021/3/31
力扣90:回溯算法
https://leetcode-cn.com/problems/subsets-ii/
//===================================
class Solution {
public:
int n;
vector<vector<int>> ans;
vector<int> path;
vector<int> *p;
void dfs(int x)
{
if(x==n){
ans.push_back(path);//如果已经选好n个,那么path就是其中之一个子集
return ;
}
int end=x;
while(end<n&&(*p)[end]==(*p)[x]) end++;
dfs(end); //把不选数字的情况考虑进去
for(int i=x;i<end;i++)
{
path.push_back((*p)[i]);//把选了i-x+1个数子的情况考虑进去
dfs(end);
}
for(int i=x;i<end;i++)
path.pop_back(); //填了end-x个数字,就要再把他们移出来,回溯算法的思想
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
n=nums.size();
sort(nums.begin(),nums.end());
p=&nums;//用指针避免函数传参浪费时间
dfs(0);
return ans;
}
};