90. Subsets II

本是古典 何须时尚 2022-04-12 09:00 286阅读 0赞

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

  1. Input: [1,2,2]
  2. Output:
  3. [
  4. [2],
  5. [1],
  6. [1,2,2],
  7. [2,2],
  8. [1,2],
  9. []
  10. ]

方法:回溯法

避免出现重复的子集的两个要点:(1)回溯之前先排序(2)用Set记录已有的子集。

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  4. vector<vector<int>> result; //存储最终结果
  5. vector<int> item; //回溯时,产生各个子集的数组
  6. set<vector<int>> setRes; //去重使用的集合
  7. sort(nums.begin(), nums.end()); //排序
  8. result.push_back(item);
  9. generate(0, nums, item, setRes, result);
  10. return result;
  11. }
  12. private:
  13. void generate(int i,vector<int>& nums, vector<int>& item, set<vector<int>> &setRes, vector<vector<int>> &result)
  14. {
  15. if(i>= nums.size())
  16. return;
  17. item.push_back(nums[i]); //添加当前元素
  18. if(setRes.find(item) == setRes.end()) //在setRes中无法找到item
  19. {
  20. setRes.insert(item);
  21. result.push_back(item);
  22. }
  23. generate(i+1, nums,item,setRes,result); //第一次递归调用
  24. item.pop_back(); //不添加当前元素
  25. generate(i+1, nums,item,setRes,result); //第二次递归调用
  26. }
  27. };

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读