zoukankan      html  css  js  c++  java
  • 78. Subsets

    https://leetcode.com/problems/subsets/

    本题大意:给出一个整数集合(集合元素具有相异性),求出所有的子集合。

    例如:如果给定集合为[1,2,3],那么答案应为:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
    解题思路:手动模拟该过程,结果应该包含:含有0个元素的集合(空集),含有1个元素的集合,含有2个元素的集合……含有n个元素的集合(全集)。
    对于含有k个元素的集合应该怎么找呢?第一次从集合的第一个元素开始找,同时k-1,第二次从剩下的第一个元素开始找,同时k-1……一直到k为0,说明这样的集合找到了。
    递归的奥妙就在于,第一轮中:换掉的只是最后一个元素,保持前面的元素不变,换换换一直换到原集合的最后一个元素。这么换完了一轮以后,这时候换掉的可不止一个元素了,应该是换完倒数第二个元素以后,再进行新的一轮换最后一个元素。
    这么进行递归就会得到所有的情况。
    建议手动模拟整个递归调用的过程。
    代码如下:
     1 class Solution {
     2 public:
     3     vector<vector<int> > subsets(vector<int>& nums) {
     4         vector<int> tmp;
     5         vector<vector<int> >result;
     6         sort(nums.begin(),nums.end());
     7         for(int i = 0; i <= nums.size(); i++)
     8         {
     9             subsetsHelper(result, tmp, nums, i, 0);
    10         }
    11         return result;
    12     }
    13     void subsetsHelper(vector<vector<int> >& result, vector<int>& tmp, vector<int>& nums, int k, int start)
    14     {
    15         if(k == 0)
    16         {
    17             result.push_back(tmp);
    18             return;
    19         }
    20         for(int i = start; i < nums.size(); i++)
    21         {
    22             tmp.push_back(nums[i]);
    23             subsetsHelper(result, tmp, nums, k-1, i+1);
    24             tmp.pop_back();
    25         }
    26     }
    27 };
  • 相关阅读:
    flex datagrid进行删除或增加操作后自动刷新
    java 一个很简单的applet
    转:35岁前必成功的12级跳(男女通用)
    flex DisplayObject UIComponent的区别
    flex flash.utils.Dictionary和Object
    java 正则表达式进行剔除字符
    Flex 元数据标签使用
    使用TableAdapter的Update方法使用注意事项
    android中捕捉menu按键的点击事件
    Repeater 嵌套repeater输出不规则列表
  • 原文地址:https://www.cnblogs.com/jingyuewutong/p/5584427.html
Copyright © 2011-2022 走看看