77. 组合*【力扣】

题意理解

输入最大数字和组合长度,求1到最大数字之间数字的组合长度等于给定的组合长度,输出所有这样的组合。

问题分析

回溯法

实质是dfs

指定限制条件,指定搜索范围。

参数有一个结果集,有一个单个结果,有一个候选集,有一个终止条件,有一个当前位置。

其他

链接

    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> results{};
        vector<int> result{};
        vector<int> candidates;
        for (int i = 0; i < n; i ++)    //转化为候选集
        {
            candidates.push_back(i + 1);
        }
        dfs (results, result, candidates, k, 0);
        return results;
    }
    
    void dfs (vector<vector<int>>& results, vector<int>& result, vector<int> candidates, int k, int level) // 组合结果集,单个结果,候选集,限制长度,当前层级
    {
        //边界
        if (result.size() == k)    //长度满足条件
        {
            results.push_back(result);    //单个结果加入结果集中
            return;
        }
        //搜索
        for (int i = level; i != candidates.size() && result.size() < k; i ++) //遍历当前候选值
        {
            result.push_back(candidates[i]);    //候选值加入单个结果
            dfs(results, result, candidates, k, i + 1);    //递归遍历,候选集范围缩小1
            result.pop_back();    //回退当前候选值
        }
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值