代码随想录|Day21|回溯01|77.组合

77.组合

组合问题不考虑顺序,例如 [1, 2][2, 1] 是同一个组合。其中 n 为取数的范围,每个组合包含 k个 元素数量,所以我们嵌套 k 个 for循环 可以很容易写出暴力解法。但如果 k 的值过大,代码将会非常冗长。

我们考虑回溯,可以将组合问题看作一棵树,为树的宽度,k 为树的深度,回溯的本质依然是暴力解法,只是不需要显式写出嵌套循环而已,而是用递归代替。

class Solution:def combine(self, n: int, k: int) -> List[List[int]]:# 递归参数 start,起始元素# 见上图,由于是组合问题,不能选择之前选择过的元素# 否则会导致重复def backtrack(start, path):# 递归终止限制条件:长度满足,遍历到叶子结点if len(path) == k:# 注意,这里要创建浅拷贝# 否则接下来对 path 的修改将会影响到已经存在 result 中的pathresult.append(path[:])return# 此循环确保遍历所有的 n,遍历宽度for num in range(start, n + 1):# 对于每一个 n,递归向下遍历,遍历深度path.append(num)backtrack(num + 1, path)path.pop()result = []backtrack(start = 1, path = [])return result

 剪枝:既然已知 k,那么在元素不足以凑齐 k个 的情况下直接剪枝。具体的操作很简单,只需要修改递归终止条件即可。

class Solution:def combine(self, n: int, k: int) -> List[List[int]]:def backtrack(start, path):if len(path) == k:result.append(path[:])return# 剪枝# 从当前的 start 开始,到 n 结束,剩余的数字必须足够构成长为 k 的组合# k - len(path):当前组合还需要的元素数量# n - (k - len(path)) + 1 为最远需要的数字# + 1:range不含尾for num in range(start, n - (k - len(path)) + 1 + 1):path.append(num)backtrack(num + 1, path)path.pop()result = []backtrack(start = 1, path = [])return result

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyExcel 导入、导出Excel 封装公共的方法

文档包含三部分功能 1、easyExcel 公共导出list<对象>方法&#xff0c;可以自定义excel中第一行和样式 2、easyExcel 导入逻辑&#xff0c;结合spring Validator 验证导入数据是否符合规范 3、easyExcel 自定义导出 list<map> 、 list<对象> &#xff08;可…

KBP210-ASEMI新能源专用整流桥KBP210

编辑&#xff1a;ll KBP210-ASEMI新能源专用整流桥KBP210 型号&#xff1a;KBP210 品牌&#xff1a;ASEMI 封装&#xff1a;KBP-4 正向电流&#xff08;Id&#xff09;&#xff1a;2A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;6…

BswM模块配置指导

文章目录 BswM配置的分类自动配置:通信控制Rule:CC_ComMChannel_Rx自动配置:Ecu状态处理自动配置:模块初始化其他配置总结BswM模块是基础软件的模式管理模块,模式/状态控制都是由BswM模块进行,其实现的方式是通过 “请求-仲裁-执行”三步完成。本篇基于基本Can通信所用到…

Vue3--条件与循环

Vue主要通过v-if和v-for两个指令来控制DOM元素的生成、移除和批量展示。 v-if v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值的时候被渲染。 <h1 v-if"awesome">Vue is awesome!</h1> //当awesome是假值时&#xff0c;h1标签将…

01背包 与 emo题目背景(周超人的遗憾) 的爱恨情仇

本题背景有意思&#xff0c;大家当乐子看&#xff0c;目前没有找到题目原题&#xff0c;也没有写过完全是01背包模板的题目&#xff0c;该篇文章大家注意其01背包一维写法的模板就好&#xff0c;注意各个关键点 ✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&…

算力,承载AI无限可能

年后不久&#xff0c;美国人工智能研究公司OpenAI推出的Sora模型引起了广泛关注&#xff0c;对于人工智能发展之快的感慨还未过去&#xff0c;3月初&#xff0c;Anthropic丢出一颗“王炸”Claude3&#xff0c;其中Claude 3 Opus宣称在基准测试中优于OpenAI的GPT-4和Google的Gem…

MyBatis Plus(代码生成器)

一、安装 安装MyBatisPlus插件 二、配置 1、 在生成代码之前首先需要配置所要连接的数据库 下面所对应的分别是&#xff1a; 所要连接的数据库 数据库驱动 用户名 密码 2、 点击Other->Code Generator 开始配置所需选项

VMWare虚拟机使用openmediavault搭建NAS服务器完整步聚

下载: gopenmediavault - The open network attached storage solution 下载好openmediavault的ISO镜像后,打开虚拟机并安装 系统类型选择Debian 启动虚拟机并安装openmediavault 选择中文 地区选中国 键盘配置选汉语 开始安装 配置网络信息 配置root密码 确认密码 系统安装中…

【算法刷题 | 栈】3.16(有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值)

文章目录 1.有效的括号1.1题目1.2解法&#xff1a;栈 2.删除字符串中的所有相邻重复项2.1题目2.2解法&#xff1a;栈 3.逆波兰表达式求值3.1题目3.2解法&#xff1a;栈 1.有效的括号 1.1题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff…

每日学习笔记:C++ STL 的map、multimap

定义 特点 操作函数 意思就是&#xff0c;使用tuple中的元素来初始化pair&#xff0c;即string(“hello”)、complex(3.4,7.8) 元素的移除讨论

jS 正则

概念 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。 创建正则表达式 两种方法&#xff1a;字面量方式、构造…

HTML5+CSS3+JS小实例:全屏范围滑块

实例:全屏范围滑块 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…