力扣算法题—078集合

Posted zzw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣算法题—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 }

 

以上是关于力扣算法题—078集合的主要内容,如果未能解决你的问题,请参考以下文章

解题报告力扣 第 262 场周赛

刷题精选:力扣565.数组嵌套

刷题精选:力扣565.数组嵌套

刷题精选:力扣565.数组嵌套

JavaScript返回某集合中的所有子集(力扣面试题 08.04. 幂集)

算法练习题力扣练习题——数组:三数之和