码迷,mamicode.com
首页 > 编程语言 > 详细

力扣算法题—078集合

时间:2019-04-16 16:16:53      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:pre   集合   题目   oid   end   输出   ret   amp   vector   

给定一组不含重复元素的整数数组 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 }

 

力扣算法题—078集合

标签:pre   集合   题目   oid   end   输出   ret   amp   vector   

原文地址:https://www.cnblogs.com/zzw1024/p/10717650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!