算法打卡day21(开始回溯)

news2024/11/26 16:29:52

今日任务:

1)77.组合

77.组合

题目链接:77. 组合 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!哔哩哔哩bilibili

带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!哔哩哔哩bilibili

思路:

直截了当就是暴力法,循环遍历就行,但是当k比较大时,这不好写了,相当于循环嵌套50层。这个时候可以采用递归(回溯),传入遍历起始和终止点

注意:哪怕采用回溯,也是穷举法,只是写起来方便

举例:

第一层循环遍历到1,存入数组中,接着第二层遍历从2开始遍历,得到[1,2],满足要求,可以返回,回到第二层的遍历,到3,此时数组中已经有[1,2],了所以在返回第二层遍历前,我们还需要回溯,弹出2,再回到第二层遍历,此时添加3,得到[1,3],弹出3····

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        result = []
        self.traveral(n, k, 1, [], result)
        return result

    def traveral(self, n, k, start, path, result):
        # 递归层
        for i in range(start, n + 1):
            path.append(i)

            # 终止条件
            if len(path) == k:
                result.append(path[:])
            else:
                self.traveral(n, k, i + 1, path, result)

            path.pop()

这种方法会遍历所有的情况,我们可以对上面代码进行一些优化

  1. 提前剪枝: 当当前路径的长度已经达到了目标长度 k 时,就不需要再继续递归了,可以直接返回,避免不必要的递归调用。

  2. 优化递归函数的参数传递: 可以将 result 参数设置为类的成员变量,这样在递归调用中就不需要传递该参数了。

  3. 补充剪枝:当剩下的可选数不够了,直接剪枝

举个例子:

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        # 将result变为成员变量,省略传递
        self.result = []
        self.traversal(n, k, 1, [])
        return self.result

    def traversal(self, n: int, k: int, start: int, path: List[int]) -> None:
        # 终止条件:当前路径长度等于 k
        if len(path) == k:
            self.result.append(path[:])
            return

        # 递归层
        for i in range(start, n + 1):
            # 提前剪枝:如果剩余可选数的个数不够,直接返回
            if n - i + 1 < k - len(path):
                return
            path.append(i)
            self.traversal(n, k, i + 1, path)
            path.pop()

感想:这题不算难,但是需要自己画图想清楚,还不是很清晰的时候,可以先写一点,打印中间过程,对递归就比较清晰了

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

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

相关文章

第一次给开源项目做贡献,我给 Hutool 改了行注释

大家好&#xff0c;我是松柏。 前两天在修 bug 的时候&#xff0c;写了个indexOf的方法。 这个方法是用来获取一段文本中某个字符串第 n 次出现的索引&#xff0c; 由于第一次写这个方法的时候少考虑了一种边界条件&#xff0c;导致最后查出的数据有时候会不符合预期。 我处…

【跟着CHATGPT学习硬件外设 | 03】UART

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 UART&#xff0c;全称为"Universal Asynchronous Receiver/Transmitter"&#xff08;通用异步收发器&#xff09;&#xff0c;是一种常用的串行通信协议。UART最早…

AI学习-Pandas数据处理分析

文章目录 1. Pandas概述2. Series用法2.1 Series的创建2.2 Series的取值2.3 Series的相关方法 3. DataFrame用法3.1 DataFrame创建3.2 DataFrame取值3.3 DataFrame相关方法 1. Pandas概述 ​ Pandas 是一个开源的数据分析处理库&#xff0c;它应用在数据科学、统计分析、机器学…

2006-2023年2月各地级市城投债详细数据

2006-2023.2各地级市城投债详细数据 1、时间&#xff1a;2006-2023.2 2、来源&#xff1a;深圳证券交易所和上海证券交易所官网、人民银行、证券监督管理委员会等金融监管机构等官网 3、指标&#xff1a;省份、城市、证券代码、证券简称、债券简称、证券全称、债券初始面值单…

应急响应靶机训练-Linux2题解

前言 接上文&#xff0c;应急响应靶机训练Linux2 靶机地址&#xff1a;应急响应靶机-Linux(2) 题解 登录虚拟机&#xff1a; 修改面板密码 提交攻击者IP 答案&#xff1a;192.168.20.1 查看宝塔日志即可 用的net直接是网关 提交攻击者修改的管理员密码(明文) 答案&…

QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法

前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4&#xff0c;在使用过程中发现&#xff0c;VM虚拟机的鼠标的光标会突然消失&#xff0c;但鼠标其他正常&#xff0c;就是光标不见了&#xff0c;下面是解决办法。 内容 如下图&#xff0c;输入mouse&a…

Java多线程三种实现方式

一、继承Thread方法 public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 10; i) {System.out.println(getName() "输出内容");}}public static void main(String[] args) {MyThread thread1 new MyThread();MyThread thread…

【UI框架】——保姆式使用教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

leetCode刷题 22. 括号生成

目录 思路 解题方法 复杂度 code 题目&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())"…

Docker 哲学 - Dockerfile 指令

Dockerfile 的 entrypoint 和 cmd 书写方式一样吗&#xff0c;分别用一个node项目的 demo来举例 Dockerfile 的 entrypoint 、cmd 有什么区别&#xff0c;分别举例他们同时出现的场景和 单独出现的场景 entrypoint 和 cmd 命令&#xff1a; 同时出现&#xff1a; 1、cmd 作为 e…

静态住宅IP好用吗?怎么选择?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

uniapp 中引入第三方组件后,更改组件的样式 -使用/deep/不生效

在我们使用Vue搭建项目的时候&#xff0c;我们经常会用到一些UI框架&#xff0c;如Element&#xff0c;iView&#xff0c;但是有时候我们又想去修改Ul框架的样式&#xff0c;当我们修改样式失败的时候&#xff0c;可以尝试一下/deep/&#xff0c;亲测有效。 那失败的原因是什么…

Java数据结构-链表OJ题

目录 1. 移除链表元素2. 反转链表3. 返回中间结点4. 返回倒数第k个结点5. 合并两个有序链表6. 分割链表7. 回文链表8. 找相交链表的公共结点9. 判断链表是否有环10. 返回链表环的入口 老铁们好&#xff0c;学习完链表这个数据结构之后&#xff0c;怎么能少了OJ题呢&#xff1f;…

下载及安装PHP,composer,phpstudy,thinkPHP6.0框架

文章目录 目录 文章目录 前言 一、下载PHP 二、下载composer 三、下载PHPstudy 四、下载think PHP 1.下载 2.多应用开发 前言 thinkPHP是一款开源的PHP框架&#xff0c;它是基于MVC&#xff08;Model-View-Controller&#xff09;设计模式构建的。thinkPHP提供了丰富的…

牛客NC30 缺失的第一个正整数【simple map Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

【跟着CHATGPT学习硬件外设 | 01】SPI

文章目录 &#x1f680; 概念揭秘关键精华&#x1f31f; 秒懂案例生活类比实战演练 &#x1f50d; 原理与工作流程探秘步骤1&#xff1a;初始化SPI接口步骤2&#xff1a;主设备启动通信步骤3&#xff1a;主设备发送数据步骤4&#xff1a;从设备接收数据步骤5&#xff1a;从设备…

Android开发 OCR:通过Tesseract实现图片文字识别

下面是整个详解步骤过程 效果图一、OCR的含义二、什么是Tesseract三、前提准备1、添加依赖2、数据文件下载路径 四、实际代码案例Demo如下&#xff1a;Main.xmlMain.java 效果图 流程&#xff1a;获取assets中的图片显示到页面&#xff0c;提取照片内的文字 一、OCR的含义 o…

输出1到10的阶乘--C语言

#include<stdio.h> int fac(int n){if(n<1){return 1;}elsereturn fac(n-1)*n; } int main(){int i, result;for(i1;i<10;i){resultfac(i);printf("%d!%d\n",i,result);}} 输出结果&#xff1a;

软件工程 - 04 需求分析

文章目录 需求分析需求分析方法系统建模用例图类图对象图活动图时序图协作图构件图部署图 软件开发各个阶段的图 需求分析 软件开发中非常重要的一环&#xff1b;好的需求分析方法&#xff0c;可以帮助更好地理解用户需求&#xff0c;准确定义系统的功能和性能要求&#xff0c…

特征选择集大成的包-arfs(python)

特征选择集大成的包-arfs&#xff08;python&#xff09; 一、介绍 arfs介绍文档https://arfs.readthedocs.io/en/latest/Introduction.html 英文好的朋友可以阅读作者写的介绍&#xff1a; All relevant feature selection means trying to find all features carrying info…