当前位置: 首页 > article >正文

leetcode77.组合

leetcode77.组合

组合

题目抽象

我们把组合问题抽象为以下树形结构:

在这里插入图片描述

我们将上图的树形结构称之为决策树,从决策树中我们可以看出,n决定决策树的宽度即循环次数,而k决定决策树的深度即递归次数

在这里插入图片描述

我们挑选出某一具体路径来进行分析。我们在得到[1,2]后递归返回,想要再得到[1,3],就需要把2

“还回去”,因此,这便是一道经典的回溯问题

回溯三部曲

  • 确定递归函数的函数头

首先我们要定义两个全局变量

  • vector<vector<int>> ret:存放最终返回值
  • vector<int> path:存放某一符合要求的结果

也可以将这两个全局变量当作参数传递给递归函数

void dfs(int n, int k, int start)

start用来确定下一层递归的开始位置,调用下一层递归函数时传入start+1,可以避免取到重复元素

  • 单层遍历的过程

for循环中,istart位置开始遍历,path存放取到的值,调用下一层递归,递归结束后回溯

for(int i=start;i<=n;i++)
{
    path.push_back(i);
    dfs(n,k,i+1);
    path.pop_back();
}
  • 确定递归函数终止条件

path.size() == k时递归终止,将path加入ret中后返回

if(path.size() == k)
{
    ret.push_back(path);
    return;
}

完整代码

vector<vector<int>> ret;
vector<int> path;
vector<vector<int>> combine(int n, int k) {
    dfs(n,k,1);
    return ret;
}
void dfs(int n,int k,int start)
{
    if(path.size() == k)
    {
        ret.push_back(path);
        return;
    }
    for(int i=start;i<=n-k+path.size()+1;i++)
    {
        path.push_back(i);
        dfs(n,k,i+1);
        path.pop_back();
    }
}

http://www.kler.cn/a/579473.html

相关文章:

  • 基于STC89C52的8x8点阵贪吃蛇游戏
  • Vue 3 实现富文本内容导出 Word 文档:前端直出方案与优化实践
  • 【SpringBoot】深入解析 Maven 的操作与配置
  • 计算机网络:电路交换,报文交换,分组交换
  • golang学习笔记——go语言安装及系统环境变量设置
  • 2025.3.9机器学习笔记:文献阅读
  • 物联网-IoTivity:开源的物联网框架
  • 深度学习DNN实战
  • 批量删除 Excel 中所有图片、某张指定图片以及二维码图片
  • 电子档案图片jpg格式表单化审核
  • MySQL面试篇——性能优化
  • 热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
  • 学习工具的一天之(burp)
  • LeetCode 31 - 下一个排列
  • 快速排序c语言版
  • Windows编译环境搭建(MSYS2\MinGW\cmake)
  • langchain4j+ONNX小试牛刀
  • STM32如何精准控制步进电机?
  • 解决CentOS 8.5被恶意扫描的问题
  • Ubuntu切换lowlatency内核