力扣算法题—078集合
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
1 #include "_000库函数.h" 2 3 4 //这道题就是求不同的子集问题 5 class solution { 6 public: 7 vector<vector<int>> subsets(vector<int>& nums) { 8 if (nums.empty())return { {} }; 9 vector<vector<int>>res; 10 res.push_back({}); 11 for (int i = 1; i <= nums.size(); ++i) { 12 vector<int>v; 13 helper(nums, i, 0, v, res);//求不同个数的子集 14 } 15 return res; 16 } 17 18 void helper(vector<int>& nums, int k, int level, vector<int>&v, vector<vector<int>>&res) { 19 if (v.size() == k) { 20 res.push_back(v); 21 return; 22 } 23 for (int i = level; i < nums.size(); ++i) { 24 v.push_back(nums[i]); 25 helper(nums, k, i + 1, v, res); 26 v.pop_back(); 27 } 28 } 29 30 }; 31 32 //使用叠加方法 33 //每次在原数组的基础上加入后面的数字 34 //比如对于题目中给的例子[1, 2, 3]来说,最开始是空集, 35 //那么我们现在要处理1,就在空集上加1,为[1],现在我们有两个自己[]和[1], 36 //下面我们来处理2,我们在之前的子集基础上,每个都加个2,可以分别得到[2],[1, 2], 37 //那么现在所有的子集合为[], [1], [2], [1, 2],同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 38 //再加上之前的子集就是所有的子集合了,代码如下: 39 class Solution { 40 public: 41 vector<vector<int>> subsets(vector<int>& nums) { 42 if (nums.empty())return { {} }; 43 vector<vector<int>>res; 44 res.push_back({}); 45 for (int i = 0; i < nums.size(); ++i) { 46 int n = res.size(); 47 for (int j = 0; j < n; ++j) { 48 vector<int>v = res[j]; 49 v.push_back(nums[i]);//添加新的数据 50 res.push_back(v); 51 } 52 } 53 return res; 54 } 55 }; 56 57 58 void T078() { 59 Solution s; 60 vector<int>n = { 1,2,3 }; 61 vector<vector<int>>v; 62 v = s.subsets(n); 63 for (auto a : v) { 64 for (auto b : a) 65 cout << b << " "; 66 cout << endl; 67 } 68 }