Leetcode 77. 组合

Leetcode 77. 组合

题目

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案

思路

  • 递归函数的返回值以及参数
    在这里需要定义两个全局变量,一个用来存放符合条件的单一结果,一个用来存放符合条件结果的集合。对于递归函数,我们需要传入参数n,k。更重要的是传入参数startindex,该参数表示记录本层递归中集合从哪里开始遍历。在集合[1,2,3,4]中取出1之后,下一层递归就要开始在[2,3,4]中取数字了。

  • 回溯函数的终止条件
    当path数组的大小是k,代表达到所谓的叶子节点,此时用result数组将path数组保存起来,终止本层递归

  • 单层搜索的过程
    回溯法的搜索过程就是一个树型结构的遍历过程,for循环用来横向遍历,递归的过程就是纵向遍历。for循环每次从startindex开始遍历,然后用Path保存取到的节点I,递归函数backtracking不停的调用自己,向深处遍历,遇到叶子节点就开始返回上一层,然后开始回溯操作,撤销本次处理的结果。

代码

class Solution {
public:
    vector<int> path;// 用来存放符合条件的结果  记录每一种组合  其实就是二叉树的路径
    vector<vector<int>> result;//存放符合条件的结果的集合

    void backtracking(int n,int k,int startindex)
    {
        // n代表集合大小 k代表从集合n中取k个元素
        // startindex 代表用于每次选择元素范围大小的调整
        if(path.size() == k)
        {
            // 当path的大小是k的时候  代表到达了叶子节点  存放结果 并且结束本层的递归 准备回溯
            result.push_back(path);
            return;
        }

        // 控制单层集合的遍历  横向遍历
        for(int i = startindex; i <= n; i++)
        {
            path.push_back(i);
            backtracking(n,k,i + 1);// 控制树的纵向遍历  下一层搜索要从i + 1开始
            path.pop_back();// 回溯 撤销处理的节点  接着寻找下一种结果
        }
    }

    vector<vector<int>> combine(int n, int k) {
        result.clear();
        path.clear();
        backtracking(n,k,1);
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值