leetcode78 - Subsets - medium

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
 
画个recursion tree,从空集开始,对于原始set里的每个数,无非是取或者不取
                    { }                             // add 1?
                     /\
         {1}                     { }      // add 2?
            /\                         /\
       {1,2}     {1}                {2}           { }          // add 3?
                 /\            /\                  /\              /\
   {1,2,3} {1,2}  {1,3} {1}    {2,3} {2}   {3} { }
 
遍历每个数,每次分两路,加的话就先把它加进当前subset里再继续到下一层,不加的话,把它pop出来再继续下一层,有点recursive dfs的意思
idx等于原始set大小的时候,表示每个数都操作过了,也就是到了recursion tree的叶节点了,把subset push进返还结果里,subset有2n
 
实现:
class Solution {
    
private:
    void dfs(vector<int>& nums, vector<vector<int>>& res, vector<int>& subset, int idx){
        if (idx == nums.size())
            res.push_back(subset);
        else{
            subset.push_back(nums[idx]);
            dfs(nums, res, subset, idx+1);
            subset.pop_back();
            dfs(nums, res, subset, idx+1);
        }
    }
    
public:
    
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> subset;
        dfs(nums, res, subset, 0);
        return res;
    }
    
};

 

posted @ 2020-08-06 15:13  little_veggie  阅读(133)  评论(0)    收藏  举报