LeetCode/solutions/78. Subsets.md
2019-03-22 14:57:49 +08:00

3.1 KiB
Raw Blame History

78. Subsets

思路

返回给定集合的所有子集。

思路一、DFS

像这种返回所有可能的组合的题目常规思路都是DFS。
原集合每一个数字只有两种状态,要么存在,要么不存在,那么在构造子集时就有选择和不选择两种情况,所以可以构造一棵二叉树,左子树表示选择该层处理的节点,右子树表示不选择,最终的叶节点就是所有子集合,树的结构如下:

                        []        
                   /          \        
                  /            \     
                 /              \
              [1]                []
           /       \           /    \
          /         \         /      \        
       [1 2]       [1]       [2]     []
      /     \     /   \     /   \    / \
  [1 2 3] [1 2] [1 3] [1] [2 3] [2] [3] []      

思路二

其实这题可以不用递归来做,对于题目中给的例子[1,2,3]来说最开始是空集那么我们现在要处理1就在空集上加1为[1] 现在我们有两个自己[]和[1]下面我们来处理2我们在之前的子集基础上每个都加个2可以分别得到[2][1, 2] 那么现在所有的子集合为[], [1], [2], [1, 2]同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了。

C++

思路一

好理解版

class Solution {
private:
    void DFS(vector<vector<int>>&res, vector<int>&subset, const vector<int>& nums, int level){
        if(level == nums.size()) {  // 到达叶节点
            res.push_back(subset);
            return;
        }
        // 向左子树下降
        subset.push_back(nums[level]);
        DFS(res, subset, nums, level + 1);
        subset.pop_back();
        // 向右子树下降
        DFS(res, subset, nums, level + 1);
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>subset;
        sort(nums.begin(), nums.end());
        DFS(res, subset, nums, 0);
        return res;
    }
};

简洁版

class Solution {
private:
    void DFS(vector<vector<int>>&res, vector<int>&subset, const vector<int> &nums, const int level){
        res.push_back(subset);
        if(level == nums.size()) return;
        for(int i = level; i < nums.size(); i++){
            subset.push_back(nums[i]);
            DFS(res, subset, nums, i+1);
            subset.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>subset;
        DFS(res, subset, nums, 0);
        return res;      
    }
};

思路二

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