给定一组不含重复元素的整数数组 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> subsets(vector & nums) { 8 if (nums.empty())return { {} }; 9 vector >res;10 res.push_back({}); 11 for (int i = 1; i <= nums.size(); ++i) {12 vector v;13 helper(nums, i, 0, v, res);//求不同个数的子集14 }15 return res;16 }17 18 void helper(vector & nums, int k, int level, vector &v, vector >&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 > subsets(vector & nums) {42 if (nums.empty())return { {} };43 vector >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 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 n = { 1,2,3 };61 vector >v;62 v = s.subsets(n);63 for (auto a : v) {64 for (auto b : a)65 cout << b << " ";66 cout << endl;67 }68 }