leetcode 90. Subsets II

╰+攻爆jí腚メ 2022-08-21 03:11 292阅读 0赞

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

  1. [
  2. [2],
  3. [1],
  4. [1,2,2],
  5. [2,2],
  6. [1,2],
  7. []
  8. ]
  9. class Solution {
  10. void select_one(set<pair<set<int>, set<int>>>&candi)
  11. {
  12. set<pair<set<int>, set<int>>>newcandi;
  13. for (set<pair<set<int>, set<int>>>::iterator it
  14. = candi.begin(); it != candi.end(); it++)
  15. {
  16. for (set<int>::iterator it1 = it->second.begin(); it1 != it->second.end(); it1++)
  17. {
  18. set<int>sel = it->first;
  19. set<int>remainindex = it->second;
  20. sel.insert(*it1);
  21. remainindex.erase(*it1);
  22. if (newcandi.find(pair<set<int>, set<int>>(sel, remainindex)) == newcandi.end())
  23. newcandi.insert(pair<set<int>, set<int>>(sel, remainindex));
  24. }
  25. }
  26. candi = newcandi;
  27. }
  28. vector<vector<int>>combine(int m, int n)
  29. {
  30. vector<vector<int>>ret;
  31. set<int>index;
  32. for (int i = 0; i < n; i++)
  33. index.insert(i);
  34. set<pair<set<int>,set<int>>>candi;
  35. set<int>aa;
  36. candi.insert(pair<set<int>, set<int>>(aa, index));
  37. while (m-- != 0)
  38. {
  39. select_one(candi);
  40. }
  41. for (set<pair<set<int>, set<int>>>::iterator it = candi.begin(); it != candi.end(); it++)
  42. {
  43. ret.push_back(vector<int>(it->first.begin(), it->first.end()));
  44. }
  45. return ret;
  46. }
  47. public:
  48. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  49. vector<vector<int>>result;
  50. map<int, int>count;
  51. for (int i = 0; i < nums.size(); i++)
  52. count[nums[i]]++;
  53. set<map<int, int>>hist;
  54. for (int i = 0; i <= nums.size(); i++)
  55. {
  56. vector<vector<int>>re = combine(i, nums.size());
  57. for (int f = 0; f < re.size(); f++)
  58. {
  59. vector<int>tt;
  60. map<int, int>cnt;
  61. for (int j = 0; j < re[f].size(); j++)
  62. {
  63. tt.push_back(nums[re[f][j]]);
  64. cnt[nums[re[f][j]]]++;
  65. }
  66. if (hist.find(cnt) == hist.end())
  67. {
  68. hist.insert(cnt);
  69. result.push_back(tt);
  70. }
  71. }
  72. }
  73. return result;
  74. }
  75. };

超时不可避免

发表评论

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

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

相关阅读