递归 | 力扣78 怎么求子集? C++实现子集求解

题目

        有一组数,没有重复元素,计算这组数可以组成的所有的子集,结果中不可有重复的子集
        例如: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;
    }
};

运行结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值