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 }