首页 > 编程语言 >(二)回溯算法: 组合数

(二)回溯算法: 组合数

时间:2023-03-04 09:36:10浏览次数:54  
标签:组合 int startIndex back 算法 result 回溯 path backtracking

组合数

问题描述

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

感悟

作为菜鸡的自己,这题一直是自己的心头之恨,上次和好友打比赛,遇到这题直接卡顿,
想法是直接暴力,k为2直接两个for循环,但是k很大,直接暴力就体现出它的局限性质了

解析

class Solution {
public:
  //创建全局变量,方便
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.push_back(i);
            backtracking(n, k, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

其中startIndex是判断当前下标为多少开始,说实话,有点dfs的感觉,

比如最开始startIndex = 1 然后是存储就是1 然后递归到下一层startIndex就是2,当然这里的K = 2

解析为什么后面要有path.pop_back()

  • 当k = 2 的时候, 先装1 ,然后下一层的startIndex = i + 1 也就是2开始
  • 将2 存入到path容器中,这是有递归startIndex 应该为3,进入到下一层的backtracking 发现 k == path.size();回退到上一层
  • 然后就应该现在容器path 是{1, 2} 一个pop_back 变成{1} 但是还在for循环中
  • 现在i的下标是2 ,然后就i++ 就是3了

end...

标签:组合,int,startIndex,back,算法,result,回溯,path,backtracking
From: https://www.cnblogs.com/tsqo/p/17177581.html

相关文章

  • (一)回溯算法
    概念:什么是回溯算法:回溯算法是对问题的一种穷举思想,及对于一些复杂的问题进行解析,一般采用递归,只是对一些穷举进行能优化(修枝),但是本质上还是穷举,原因是没有找到更好的方......
  • 大整数乘法-算法设计与分析
    分治法-大整数乘法输入:正负零不限,两数长度也不限。输入完第一个数后,回车,输入第二个数,回车。输出:两个数相乘的结果实现思路1.用C++实现大整数乘法2.算法性能优化对......
  • Bellman_ford和spfa算法
    Bellman_ford算法bellman_ford算法在要求起点到终点存在负权边,要求在指定k步(这是spfa无法替代的)bellman_ford和spfa都可以判断图中有无负权环......
  • 每日算法 230303
    每日算法230303题目1487.保证文件名唯一给你一个长度为n的字符串数组names。你将会在文件系统中创建n个文件夹:在第i分钟,新建名为names[i]的文件夹。由于两......
  • JVM系统优化实践(7):垃圾回收器与垃圾回收算法
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~上回说到了年轻代、老年代与数据计算的一个案例。接下来就先讲一讲年轻代和老年代的两个垃圾回收器:ParNew和CMS。和Serial......
  • 算法基础1.3.3高精度乘法
    前言先看高精度加法的文章,如果没有看,我把高精度加法文章中的总结前言放到这里该文章探讨的高精度代指C++中极大整数的计算,不是浮点数(y总说那个少见,不讲)。这个问题只在C......
  • 排列组合去重方法
    题目40.组合总和II思路一道经典的排列组合去重问题,搜索的思路很简单,关键在于如何去重。借用一下代码随想录的图去重的工作实际上就是判断同一层上的相同元素是否已......
  • J3、DenseNet算法实战与解析
    ......
  • 代码随想录算法训练营Day31 贪心算法| 理论基础 455.分发饼干 376. 摆动序列 53. 最
    代码随想录算法训练营理论基础什么是贪心贪心的本质是选择每一阶段的局部最优,从而达到全局最优。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。贪......
  • 算法随想Day28【贪心算法】| LC445-分发饼干、LC376-摆动序列、LC53-最大子序和
    LC445.分发饼干intfindContentChildren(vector<int>&g,vector<int>&s){intcount=0;sort(g.begin(),g.end());sort(s.begin(),s.end());fo......