zoukankan      html  css  js  c++  java
  • 力扣算法题—090子集2

    给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

    说明:解集不能包含重复的子集。

    示例:

    输入: [1,2,2]
    输出:
    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]

     1 #include"_000库函数.h"
     2 
     3 
     4 class Solution {
     5 public:
     6     vector<vector<int>> subsetsWithDup(vector<int> &nums) {
     7         if (nums.empty()) return {};
     8         vector<vector<int>> res(1);
     9         sort(nums.begin(), nums.end());
    10         int size = 1, last = nums[0];
    11         for (int i = 0; i < nums.size(); ++i) {
    12             if (last != nums[i]) {//去除重复数字
    13                 last = nums[i];
    14                 size = res.size();
    15             }
    16             int newSize = res.size();
    17             for (int j = newSize - size; j < newSize; ++j) {
    18                 res.push_back(res[j]);
    19                 res.back().push_back(nums[i]);
    20             }
    21         }
    22         return res;
    23     }
    24 };
    25 
    26 //使用二叉树递归
    27 class Solution {
    28 public:
    29     vector<vector<int>> subsetsWithDup(vector<int> &S) {
    30         if (S.empty()) return {};
    31         vector<vector<int>> res;
    32         vector<int> out;
    33         sort(S.begin(), S.end());
    34         getSubsets(S, 0, out, res);
    35         return res;
    36     }
    37     void getSubsets(vector<int> &S, int pos, vector<int> &out, vector<vector<int>> &res) {
    38         res.push_back(out);
    39         for (int i = pos; i < S.size(); ++i) {
    40             out.push_back(S[i]);
    41             getSubsets(S, i + 1, out, res);
    42             out.pop_back();
    43             while (i + 1 < S.size() && S[i] == S[i + 1]) ++i;//去除重复数据
    44         }
    45     }
    46 };
    47 
    48 
    49 void T090() {
    50     Solution s;
    51     vector<int>v = { 1,2,2 };
    52     vector<vector<int>> res;
    53     res = s.subsetsWithDup(v);
    54     for (auto &a : res) {
    55         for (auto b : a)
    56             cout << b << "  ";
    57         cout << endl;
    58     }
    59     cout << endl;
    60 }
  • 相关阅读:
    java面试总结之框架问题
    数据库设计三大范式
    js 一些技巧
    el 和 fmt 常用
    iframe自适应高度
    MySQL基础
    任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal)
    hibernate
    Struts2
    Servlet、Cookie、Session
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10774241.html
Copyright © 2011-2022 走看看