diff --git a/solutions/78. Subsets.md b/solutions/78. Subsets.md new file mode 100644 index 0000000..131a6c0 --- /dev/null +++ b/solutions/78. Subsets.md @@ -0,0 +1,64 @@ +# [78. Subsets](https://leetcode.com/problems/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++ +## 思路一 +``` C++ +class Solution { +private: + void DFS(vector>&res, vector&subset, const vector &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> subsets(vector& nums) { + vector>res; + vectorsubset; + DFS(res, subset, nums, 0); + return res; + } +}; +``` +## 思路二 +``` C++ +class Solution { +public: + vector> subsets(vector& nums) { + vector>res; + res.push_back(vector{}); + 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; + } +}; +```