78. 子集
Posted shayue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了78. 子集相关的知识,希望对你有一定的参考价值。
题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
算法
?方法1: 对数组从前往后遍历,当遇见一个新数字,便将之前所有已经保存的子集加上这个数字后重新存入。
?方法2: 采用递归的方法,对数组从前往后遍历。当遇见一个新数字时,可以选择加入该数字或者不加入该数字以构成子集,存入保存的二维向量中。
代码
方法一
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> backVec;
vector<int> _ = {};
backVec.push_back(_);
if(nums.size() == 0)
return backVec;
// 从前往后遍历,新数字是nums[i]
for(int i = 0; i < nums.size(); i++)
{
// 当前的二维向量一共有size个一维向量
int size = backVec.size();
for(int j = 0; j < size; j++)
{
// 对size个一维向量增加新数字nums[i],再重新插入二维向量
vector<int> tmp = backVec[j];
tmp.push_back(nums[i]);
backVec.push_back(tmp);
}
}
return backVec;
}
};
int main()
{
vector<int> vec = {1,2,3};
Solution s;
vector<vector<int>> Vec = s.subsets(vec);
for(auto i : Vec)
{
for(auto j : i)
cout << j << ‘ ‘;
cout << endl;
}
return 0;
}
方法二
class Solution {
public:
vector<vector<int>> backVec;
vector<int> copy_nums, temp = {};
vector<vector<int>> subsets(vector<int>& nums) {
backVec.push_back(temp);
if(nums.size() == 0)
return backVec;
copy_nums.assign(nums.begin(), nums.end());
DFS(0);
return backVec;
}
void DFS(int n)
{
// 递归出口
if(n >= copy_nums.size())
return;
// 选中当前数字
temp.push_back(copy_nums[n]);
backVec.push_back(temp);
DFS(n+1);
// 不选中当前数字
temp.pop_back();
DFS(n+1);
}
};
以上是关于78. 子集的主要内容,如果未能解决你的问题,请参考以下文章