Subsets

题目链接

Subsets - LeetCode

注意点

解法

解法一:递归,每次就将tmp加入ret中,然后往tmp中加一个数字,继续递归。原理如下,第i(i > 0)层表示nums[i-1]的状态(选择或者不选择),最后叶节点就是结果。

                        []        
                   /                  
                  /                 
                 /              
              [1]                []
           /                  /    
          /                  /              
       [1 2]       [1]       [2]     []
      /          /        /       / 
  [1 2 3] [1 2] [1 3] [1] [2 3] [2] [3] []
class Solution {
public:
    typedef vector<int> v;
    void recursion(int start,v nums,v tmp, vector<v>& ret)
    {
        ret.push_back(tmp);
        int n = nums.size();
        for(int i = start;i < n;i++)
        {
            tmp.push_back(nums[i]);
            recursion(i+1,nums,tmp,ret);
            tmp.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ret;
        v tmp;
        recursion(0,nums,tmp,ret);
        return ret;
    }
};

解法二:非递归,nums中的数字一个个处理,从空集开始,加入nums[0],然后在上一次产生的集合的基础上继续加入下一个数字nums[1],一直下去直到生成处理完所有数字。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ret(1);
        int i,j,n = nums.size();
        for(i = 0;i < n;i++)
        {
            int m = ret.size();
            for(j  = 0;j < m;j++)
            {
                ret.push_back(ret[j]);
                ret.back().push_back(nums[i]);
            }
        }
        return ret;
    }
};

小结

原文地址:https://www.cnblogs.com/multhree/p/10497306.html