題目描述
給定一組不含重複元素的整數數組 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);
}
};