我的做法:
预处理一个pair数组,first是数组元素,second是重复个数
然后dfs处理这个数组。
关键在于dfs中push_back和pop_back的顺序
重复数字需要一个一个push,然后回溯时,一起pop
/*
* @lc app=leetcode id=90 lang=cpp
*
* [90] Subsets II
*/
// @lc code=start
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<pair<int,int>> pre;
int cnt = 1;
int loc = 0;
int N = nums.size();
while(loc < N){
while(loc+1 < N && nums[loc] == nums[loc+1]){
loc++;
cnt++;
}
pre.push_back(make_pair(nums[loc++],cnt));
cnt=1;
}
//for(int i=0;i<pre.size();i++) printf("<%d %d>\n",pre[i].first,pre[i].second);
vector<vector<int>> ans;
vector<int> path;
loc=0;
dfs(ans,path,pre,loc);
return ans;
}
void dfs(vector<vector<int>>& ans,vector<int>& path,vector<pair<int,int>>& pre,int loc){
if(loc >= pre.size()){
ans.push_back(path);
return ;
}
dfs(ans,path,pre,loc+1);
for(int i=0;i<pre[loc].second;i++){
path.push_back(pre[loc].first);
dfs(ans,path,pre,loc+1);
}
for(int i=0;i<pre[loc].second;i++){
path.pop_back();
}
}
};
// @lc code=end