zoukankan      html  css  js  c++  java
  • Leetcode: Subsets & SubsetsII

    Subsets Description:

    Given a set of distinct integers, S, 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 S = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
    
     分析: 首先注意集合内的元素都是不同的整数,所以尽情产生就好了。产生subsets时,基本思想是由小到大,先产生小的,再
    利用小的产生大集合。具体来说,就是先用0个,1个,...来生成子集然后对新的元素,只要把前面的所有子集中加上个新元素,然后和之前
    的子集和在一起,就是所有子集了。这里能直接加元素,就是因为没有重复的整数
     1 class Solution {
     2 public:
     3     vector<vector<int> > subsets(vector<int> &S) {
     4         sort(S.begin(),S.end());
     5         vector<vector<int> > result;
     6         
     7         vector<int> comb;
     8         result.push_back(comb);
     9         
    10         for(int i=0;i<S.size();i++)
    11         {
    12             int nows = result.size();
    13             for(int j=0;j<nows;++j)
    14             {
    15                 comb = result[j];
    16                 comb.push_back(S[i]);
    17                 result.push_back(comb);
    18             }
    19         }
    20         
    21         return result;
    22     }
    23 };

    SubsetsII  Description:

    Given a collection of integers that might contain duplicates, S, 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 S = [1,2,2], a solution is:

    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]

    分析:这个题目和上面的唯一区别就在于集合中有相同的元素, 然后再遇到后面是相同元素的时候,添加到子集中产生新子集时,相当于要选择往里面添加几个这个元素。

    这里直接用跟上面一样的方法,只是再最后把它们放到set中,去除重复元素,然后再放回vector中返回。这种方法好像有点萌蠢。。 但是呢,根据上面的分析,还有一种

    做法,就是将vector中所有元素遍历一遍,放到map中,map中key就是元素值,value是重复的个数,然后就用这个map开始同样的过程,只是产生新的子集的时候

    ,根据value值,分别产生加不同数量的该元素。

    class Solution {
    public:
        vector<vector<int> > subsetsWithDup(vector<int> &S) {
            
            sort(S.begin(),S.end());
            set<vector<int> > setres;
            vector<vector<int> > results;
            
            vector<int> comb;
            results.push_back(comb);
            
            for(int i=0;i<S.size();i++)
            {
                int nows = results.size();
                for(int j=0;j<nows;++j)
                {
                    comb = results[j];
                    comb.push_back(S[i]);
                    results.push_back(comb);
                }
            }
            setres.insert(results.begin(),results.end());
            results.assign(setres.begin(),setres.end());
             
             return results;
        }
    };
  • 相关阅读:
    Eclipse:构造函数不提示才发现
    Java:终于找到了在alloy中的JFileChooser中的弹出式菜单不显示文字的解决办法
    java:给图片上加水印
    Asp:函数是用传值还是传址
    数据库移植注意事项
    51nod 1009 数字1的数量
    51nod1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    2017 Multi-University Training Contest
    HDU 3251 Being a Hero 最小割
  • 原文地址:https://www.cnblogs.com/soyscut/p/3787529.html
Copyright © 2011-2022 走看看