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;
        }
    };
  • 相关阅读:
    30以后,程序员一定要转管理岗吗?
    C#调用Bartender打印绑定数据库,动态设置Sql
    记一次 加载大量数据时不影响界面UI的经历
    火狐浏览器安装印象笔记剪藏
    VS自定义模板-以自定义类模板为样例
    x86架构下win 系统下使用Vmware+ubantu+qemu 模拟arm64架构+Kylin系统
    ES6操作数组的7中方法
    Vue 动态绑定CSS样式
    C# 使用HtmlAgilityPack 抓取 网站链接
    elementui——表格的相同内容单元格合并
  • 原文地址:https://www.cnblogs.com/soyscut/p/3787529.html
Copyright © 2011-2022 走看看