与78子集的思想类似,多了判断是否重复的部分
https://blog.csdn.net/weixin_44343355/article/details/128800102
class Solution {
public:
vector<vector<int>> result;
//此处集合要加上引用
void generate(vector<int> nums, vector<int> tmp, set<vector<int>>& res_set, int i){
if(i == nums.size()) return;
generate(nums, tmp, res_set, i+1);
tmp.push_back(nums[i]);
//如果该子集未重复
if(res_set.find(tmp) == res_set.end()){
res_set.insert(tmp);
result.push_back(tmp);
}
generate(nums, tmp, res_set, i+1);
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
//先对集合进行排序,升序
vector<int> tmp;
result.push_back(tmp);
if(nums.size() == 0) return result;
sort(nums.begin(), nums.end(), less<int>());
//确保集合中的各元素是升序的,以防集合1为[1,2,2],集合2为[2,1,2],但集合不判为相等的情况
int i = 0;
set<vector<int>> res_set;//用于去重,set去重所用时间复杂度为logN
res_set.insert(tmp);//集合的底层存贮结构为键值对
generate(nums, tmp, res_set, i);
return result;
}
};
指标不咋的,欢迎各位大佬批评指正!