第二十四天| 77. 组合

news2024/12/28 6:45:04

Leetcode 77. 组合

题目链接:77 组合

题干:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。

思考:回溯法。把回溯法的搜索过程抽象为树形结构。

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。

由上图可以看出n相当于树的宽度,k相当于树的深度。每次搜索到了叶子节点就找到了一个结果。故终止条件:组合长度满足条件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) {
        result.clear();
        path.clear();
        backtracking(n, k, 1);
        return result;
    }
};

优化:对单层搜索逻辑剪枝处理。如果for循环选择的起始位置之后的元素个数已经不足需要的元素个数,那么就没有必要搜索了。

代码:

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 - (k - path.size()) + 1; i++) {
            path.push_back(i);
            backtracking(n, k, i+1);        //递归处理
            path.pop_back();        //回溯
        }
    }

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

自我总结:

  • 回溯三部曲:回溯函数模板返回值以及参数、回溯函数终止条件以及回溯搜索的遍历过程      (回溯法解决的问题都可以抽象为树形结构(N叉树))
    • 回溯算法模板框架:
      void backtracking(参数) {
          if (终止条件) {
              存放结果;
              return;
          }
      
          for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
              处理节点;
              backtracking(路径,选择列表); // 递归
              回溯,撤销处理结果
          }
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1429300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东广告算法架构体系建设--大规模稀疏场景高性能训练方案演变

一、前言 京东广告训练框架随着广告算法业务发展的特点也在快速迭代升级&#xff0c;回顾近几年大致经历了两次大版本的方案架构演变。第一阶段&#xff0c;随着2016年Tensorflow训练框架的开源&#xff0c;业界开始基于Tensorflow开源框架训练更复杂的模型。模型对特征规模和…

Android之命令行烧写OTA镜像(一百八十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

MySQL 备份恢复

1.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了。 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数…

算法设计与分析实验:动态规划与回溯

目录​​​​​​​ 一、编辑距离 1.1 具体思路 1.2 思路展示 1.3 代码实现 1.4 复杂度分析 1.5 运行结果 二、买卖股票的最佳时机 2.1 具体思路 2.2 思路展示 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、单词拆分 3.1 具体思路 3.2 思路展示 3.3 代码实现…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1&#xff1a;安装 Nginx步骤 2&#xff1a;启动 Nginx 服务步骤 3&#xff1a;配置 Nginx步骤 4&#xff1a;启用配置步骤 5&#xff1a;检查配置步骤 6&#xff1a;重启 Nginx步骤 7&#xff1a;访问网站 proxy_set_header 含义…

Qt程序设计-左侧菜单栏实现

创建项目,在窗体左侧添加widget,右侧上面添加容器,容器里添加label、和关闭按钮,添加stackedwidget。 widget处理 widget里面添加几个toolButton按钮,按需添加,本例子添加4个,一个弹簧verticalSpacer 将几个按钮添加到同一个按钮组。 stackedwidget stackedwidge…

无人机激光雷达标定板

机载激光雷达标定板是用于校准和验证机载激光雷达系统的设备。由于机载激光雷达系统在测量地形、建筑物和植被等方面具有广泛的应用&#xff0c;因此标定板的使用对于确保测量结果的准确性和可靠性至关重要。 标定板通常由高反射率的材料制成&#xff0c;如镀金的玻璃或陶瓷&am…

如何选择最适合的服务器

许多朋友想做一些网站&#xff0c;应用&#xff0c;游戏&#xff0c;小程序等等&#xff0c;都需要接触一个基础&#xff0c;就是服务器。服务器相当于一台24小时不关机的联网电脑&#xff0c;浏览网页或者应用相当于用户在访问这台电脑里的文件。那么如何选择最适合自己的服务…

单片机学习笔记---中断系统(含外部中断)

目录 中断介绍 中断优先级 中断嵌套 中断技术的优点 中断的结构 中断请求源 中断优先级 5个基本中断内部的结构 INT0和INT1 T0和T1 串口 中断寄存器 IE TCON 中断优先级列表 中断号 中断响应的条件 代码编写实例分析 外部中断硬件电路分析 这一节我们主要是…

spring boot yaml文件中如何设置duration对象值

Spring Boot对表示持续时间有专门的支持。如果您公开java.time.Duration属性&#xff0c;则应用程序对应Duration类型的属性有以下格式可用: long类型的常规表示(使用毫秒作为默认单位&#xff0c;除非指定了DurationUnit)java.time.Duration 使用的标准ISO-8601格式其中值和单…

echarts绘制2D地图

简介 此案例需要用到世界地图json数据&#xff0c;我把json文件放到我的资源中&#xff0c;有需要的自行下载。 安装插件 // 安装echats npm install echarts --save项目中引用 1&#xff0c;引入安装的echarts插件 import * as echarts from echarts;2&#xff0c;引入世…

Pyecharts炫酷散点图构建指南【第50篇—python:炫酷散点图】

文章目录 Pyecharts炫酷散点图构建指南引言安装Pyecharts基础散点图自定义散点图样式渐变散点图动态散点图高级标注散点图多系列散点图3D散点图时间轴散点图笛卡尔坐标系下的极坐标系散点图 总结&#xff1a; Pyecharts炫酷散点图构建指南 引言 在数据可视化领域&#xff0c;…

一些整洁代码的原则

1. 改善if判断 当代码中出现大量防卫代码的时候&#xff08;Guard Code&#xff09;&#xff0c;需要考虑是否可以改造成fail fast的模式完成。 但是给出的建议是&#xff0c;不要过分使用防卫代码 2. 无用代码&#xff0c;just delete it&#xff01; 作者给出结论的前提是&…

Java常用

文章目录 基础基础数据类型内部类Java IOIO多路复用重要概念 Channel **通道**重要概念 Buffer **数据缓存区**重要概念 Selector **选择器** 关键字final 元注解常用接口异常处理ErrorException JVM与虚拟机JVM内存模型本地方法栈虚拟机栈 Stack堆 Heap方法区 Method Area (JD…

C#拆分字符串,正则表达式Regex.Split 方法 vs String.Split 方法

目录 一、使用的方法 1.使用Split(String, String)方法 2.String.Split 方法 二、源代码 1.源码 2.生成效果 使用正则表达式可以拆分指定的字符串。同样地&#xff0c;使用字符串对象的Split方法也可以实现此功能。使用字符串对象的Split方法可以根据用户选择的拆分条件&…

2024年【A特种设备相关管理(电梯)】考试总结及A特种设备相关管理(电梯)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;电梯&#xff09;考试总结是安全生产模拟考试一点通生成的&#xff0c;A特种设备相关管理&#xff08;电梯&#xff09;证模拟考试题库是根据A特种设备相关管理&#xff08;电梯&#x…

操作系统基础:虚拟内存【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f439;1 虚拟内存的基本概念&#x1f993;1.1 总览&#x1f993;1.2 传统存储管理方式的缺点&#x1f993;1.3 局部性原理&#x1f993;1.4 虚拟内存&#x1f99d;1…

spring boot 使用 Kafka

一、Kafka作为消息队列的好处 高吞吐量&#xff1a;Kafka能够处理大规模的数据流&#xff0c;并支持高吞吐量的消息传输。 持久性&#xff1a;Kafka将消息持久化到磁盘上&#xff0c;保证了消息不会因为系统故障而丢失。 分布式&#xff1a;Kafka是一个分布式系统&#xff0c…

Swift Vapor 教程(查询数据、插入数据)

上一篇简单写了 怎么创建 Swift Vapor 项目以及在开发过程中使用到的软件。 这一篇写一个怎么在创建的项目中创建一个简单的查询数据和插入数据。 注&#xff1a;数据库配置比较重要 先将本地的Docker启动起来&#xff0c;用Docker管理数据库 将项目自己创建的Todo相关的都删掉…

TQ15EG开发板教程:在VIVADO2023.1 以及VITIS环境下 检测DDR4

打开VIVADO2023.1 创建一个新的工程&#xff0c;设置工程名称和地址 选择RTL工程&#xff0c;勾选不添加文件 搜索15eg&#xff0c;选择xqzu15eg-ffrb1156-2-i 完成创建工程 添加设计模块 设置模块名称 在模块中添加mpsoc器件 双击器件进行配置 若有配置文件预设可以直接导入配…