题目
有一组数,没有重复元素,计算这组数可以组成的所有的子集,结果中不可有重复的子集
例如:int num[] = {1,2,3};
结果:[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]
求解
解题思路
- 递归进行求解
- 递归结束条件
- 遍历到集合(1,2,3)内的最后一个数据3时,即为得到 [],[1],[1,2],[1,2,3,]的情况下,开始结束递归
- 怎么回溯?
- 需要取出来最后放置的那个数据3
- 然后开始回溯
- 递归结束条件
- 利用C++中的vector实现存放集合
- vector<int>是一维整型数组
- temp用来保存当前数据(递归需要往回走,都需要保存当前回归前的结果)
- ret是最终数组,保存最终的结果
- 具体的过程可以结合代码进行理解
代码实现
#include<vector>
#include<iostream>
#include<algorithm>//STL库
using namespace std;
void fn(int i, vector<int>& num, vector<int>& temp, vector<vector<int>>& ret)
{
if (i >= num.size())
return;
temp.push_back(num[i]);
ret.push_back(temp);//当前每一次的结果存放在最终结果ret内
fn(i + 1, num, temp, ret);//递归进行下一次
temp.pop_back();
fn(i + 1, num, temp, ret);
}
void main()
{
vector<int> num;
num.push_back(1);
num.push_back(2);
num.push_back(3);//1 2 3 举例
vector<int>temp;
vector<vector<int>> ret;
fn(0, num, temp, ret);
for (int i = 0; i < ret.size(); i++)
{
for (int j = 0; j < ret[i].size(); j++)
cout << ret[i][j] << " ";
cout << endl;
}
}
思路演绎
运行结果
力扣
代码
class Solution {
public:
vector<int> temp;
vector<vector<int>>ret;
void fun(int i,vector<int>&num)
{
if(i>=num.size())
{
ret.push_back(temp);
return;
}
temp.push_back(num[i]);
//ret.push_back(temp);
fun(i+1,num);//temp,set)
temp.pop_back();
fun(i+1,num);
}
vector<vector<int>> subsets(vector<int>& nums) {
fun(0,nums);
return ret;
}
};