78. Subsets

Given a set of distinct integers, nums, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

 

For example,
If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

问题: 给定一个集合,求集合元素的所有组合的情况。

实际上就是一题求全组合的题目。

nums[i...n) 的所有组合情况可以分为两种:包含nums[i] 的 和 不包含 nums[i] 的。

  • 包含 nums[i] 的:nums[i] 依次加到 nums[i+1...n) 的全部情况即可。
  • 不包含 nums[i] 的 :就是 nums[i+1...n) 的全部情况。

上面的递推关系,实际上就是 DP 思路。

 1     vector<vector<int>> theset;
 2     
 3     void regardValue(int value){
 4         
 5         if (theset.size() == 0) {
 6             vector<int> tmp0;
 7             vector<int> tmp1 = {value};
 8             theset.push_back(tmp0);
 9             theset.push_back(tmp1);
10             return;
11         }
12     
13         int LofPre = (int)theset.size();
14         
15         for (int i = 0 ; i < LofPre; i++) {
16             vector<int> tmp = theset[i];
17             tmp.push_back(value);
18             theset.push_back(tmp);
19         }
20     }
21 
22     vector<vector<int>> subsets(vector<int>& nums) {
23         
24         std::sort(nums.begin(), nums.end());
25         
26         for (int i = 0; i < nums.size(); i++) {
27             regardValue(nums[i]);
28         }
29         
30         return theset;
31     }
View Code

相关文章: