代码随想录:回溯算法2-4

77.组合

题目

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

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]

代码(非剪枝)

class Solution {List<List<Integer>> res = new ArrayList<>(); //存放所有组合List<Integer> path = new ArrayList<>();  //存放当前路径组合public List<List<Integer>> combine(int n, int k) {backTracking(n,k,1);return res;}public void backTracking(int n, int k, int index){//终止条件,path大小==kif(path.size() == k){//注意必须要new,不能直接res.add(path),path是引用类型,地址复用res.add(new ArrayList<>(path));return;}//for循环遍历n个数字,分别从1,2,3,4,开始拿第一个数字,相当于树横着走for(int i = index; i <= n; i++){path.add(i); //取i放入pathbackTracking(n,k,i+1); //递归[i+1,n],选后面的数字,相当于树往下走path.remove(path.size() - 1); //回溯,把i取出}}
}

代码(剪枝)

class Solution {List<List<Integer>> res = new ArrayList<>(); //存放所有组合List<Integer> path = new ArrayList<>();  //存放当前路径组合public List<List<Integer>> combine(int n, int k) {backTracking(n,k,1);return res;}public void backTracking(int n, int k, int index){//终止条件,path大小==kif(path.size() == k){//注意必须要new,不能直接res.add(path),path是引用类型,地址复用res.add(new ArrayList<>(path));return;}//for循环遍历n个数字,分别从1,2,3,4,开始拿第一个数字//剪枝条件:n=4,k-4,path为空时,i只要到1就行,从2开始都不可能有四个数字for(int i = index; i <= n + 1 - (k - path.size); i++){path.add(i); //取i放入pathbackTracking(n,k,i+1); //递归[i+1,n],那后面的数组path.remove(path.size() - 1); //回溯,把i取出}}
}

总结

        其实就是用一个树来模拟我们手动进行组合数字的过程。(假设n=4,k=2)

        A.先考虑for循环,从[1-n]遍历,其实就是先选第一个数字1,path里面放了1,选完第一个数字add之后,执行backTracking(n,k,2),过程如下。

        ①递归[2-n],i=2,选择第二个数字2,path里放了12。选完第二个数字之后,递归[3-n],这时因为path里有2个元素了,直接进入终止条件,把path12加入res然后直接return。return后,程序回到了递归[2-n],且i=2时的第三行代码,这时将path中的2移除。

        ②继续执行递归[2-n],这时i=3,选择第二个数字3,path里放了13。 选完第二个数字之后,递归[4-n],这时因为path里有2个元素了,直接进入终止条件,把path13加入res然后直接return。return后,程序回到了递归[2-n],且i=3时的第三行代码,这时将path中的3移除。

         ③继续执行递归[2-n],这时i=4,选择第二个数字4,path里放了14。 选完第二个数字之后,递归[5-n],这时因为path里有2个元素了,直接进入终止条件,把path14加入res然后直接return。return后,程序回到了递归[2-n],且i=4时的第三行代码,这时将path中的4移除。

        执行完上面的①②③,相当于backTracking(n,k,2)执行完了,程序回到backTracking(n,k,2)的后一行,将path中的1移除。然后执行B的for循环,从[1-n]遍历,这时i=2了,其实就是先选第一个数字2,path里面放了2,选完第一个数字add之后,执行backTracking(n,k,3),继续递归选第二个数字,流程和前面的类似。后面执行C和D的for循环,i=3和i=4,直到for循环,从[1-n]遍历的循环结束。

216.组合总和III

题目

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7

代码(非剪枝)

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;  //存放当前path的和public List<List<Integer>> combinationSum3(int k, int n) {backTracking(k,n,1);return res;}public void backTracking(int k,int n,int index){//终止条件if(sum == n && path.size() == k){//注意点:必须要newres.add(new ArrayList<>(path));return;}for(int i=index; i <= 9; i++){//取出数字ipath.add(i);sum += i;//往树的下面递归,[i+1,9],取其他数字backTracking(k,n,i+1);//数字1回溯弹出sum -= i;path.remove(path.size()-1);}}
}

代码(剪枝)

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;  //存放当前path的和public List<List<Integer>> combinationSum3(int k, int n) {backTracking(k,n,1);return res;}public void backTracking(int k,int n,int index){//剪枝,如果sum超过n或者元素个数超过k,不用继续往树下面递归了。if(sum > n || path.size() > k){return;}//终止条件if(sum == n && path.size() == k){//注意点:必须要newres.add(new ArrayList<>(path));return;}//9 - (k - path.size()用了剪枝,保证肯定有k个元素,直接写9也行for(int i=index; i <= 9 - (k - path.size()) + 1 ;i++){//取出数字ipath.add(i);sum += i;//往树的下面递归,[i+1,9],取其他数字backTracking(k,n,i+1);//数字1回溯弹出sum -= i;path.remove(path.size()-1);}}
}

总结

        和77和类似,在组合数字的同时,题目77只限定的元素的个数k,这一题还限定了元素的和n。for循环用于从[1-9]选择第一个元素,把path和sum更新后,递归调用backTracking(k,n,i+1),树继续向下递归,选择其他的元素。选择完把第一个元素回溯弹出。

        剪枝方面,在77的基础上i <= 9 - (k - path.size()) + 1 ,用于保证for循环中肯定可以拿出k个元素用于组合。如果sum已经超过了n,或者path中的元素个数超过了k,都可以结束递归的过程,作为终止条件,直接return。

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

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

相关文章

开放式耳机哪个品牌质量比较好?五大热门品牌PK推荐

作为一名热爱音乐的DJ爱好者&#xff0c;我深知一款适合DJ使用的开放式耳机应该具备哪些特点。最近&#xff0c;我深入评测了几款热门开放式耳机&#xff0c;从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天&#xff0c;我想为大家分享我的评测结果&#xff0c;希…

网易云音乐格式在线转换

应用分享&#xff1a;众所周知网易云下载的格式为 .NCM&#xff0c;只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3&#xff0c;无需安装&#xff0c;转换后就能在任意播放器使用。 使用地址&#xff1a; https://ncm.worthsee.com/ 网络研究观 数据泄露…

WannaMine4.0病毒应急处置

一、前言 某日&#xff0c;通过流量监测设备和EDR发现挖矿请求告警&#xff0c;并存在长期445端口扫描。 二、病毒排查 上机排查&#xff0c;发现该服务器存在WannaMine4.0病毒&#xff0c;通过网上文章了解&#xff0c;如果请求挖矿域名遭安全设备拦截&#xff0c;会导致挖矿…

618有哪些好物值得入手?618四款必囤好物清单分享!

对于钟情于科技新品和数码产品的朋友们而言&#xff0c;每次大型购物节都是一个值得把握的机会&#xff0c;而即将来临的618购物节&#xff0c;更是让众多数码爱好者满怀期待。在此&#xff0c;我细心挑选了几款数码商品&#xff0c;希望能为您的购物清单增添几分灵感。让我们一…

系统架构设计师【第18章】: 安全架构设计理论与实践 (核心总结)

文章目录 18.1 安全架构概述18.1.1 信息安全面临的威胁18.1.2 安全架构的定义和范围18.1.3 与信息安全相关的国内外标准及组织 18.2 安全模型18.2.1 状态机模型18.2.2 Bell-LaPadula模型18.2.3 Biba模型18.2.4 Clark-Wilson模型18.2.5 Chinese Wall模型 18.3 系统安…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

智汇云舟与芯瞳完成兼容适配,共建国产化生态体系

近日&#xff0c;智汇云舟的视频孪生系列产品和时空大数据系列产品已完成与芯瞳半导体技术&#xff08;山东&#xff09;有限公司GPU产品GB2062/GB2064/CQ2040/CQ2040 MXM/CQ2040 MD的相互兼容性测试认证。双方产品经过严格测试&#xff0c;已完成兼容适配&#xff0c;具备良好…

【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

&#x1f448;️上一篇:桥接模式 | 下一篇:享元模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 目 录 外观模式&#xff08;Facade Pattern&#xff09;定义英文原文直译如何理解呢&#xff1f;字面理解代码实现中的理解生活案例&#xff1a;操作多功能料理机典型案例…

ARM32开发——串口输入

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据接收中断函数IDLE中断串口接收流程&#xff08;了解&#xff09;完整示例 需求 串口接收PC机发送的数据。 串口数据接…

【ASP】asp中变量、requst参数在html、asp、sql中的调用格式

一、html页面 - 变量 <input name"T_ID" type"hidden" value"<%T_ID%>"> <input name"T_ID" type"hidden" value"<%T_ID%>"> 二、html页面 - requst参数 <input type"hidden&…

如何在 Vue 中实现自定义的响应式系统?

在 Vue 中,我们可以通过自定义响应式系统来实现更复杂的数据处理需求。以下是一个简单的示例,演示如何在 Vue 中创建一个自定义的响应式系统: // 定义一个响应式系统 class ReactiveSystem {constructor() {this.dependencies = new Map();}// 定义一个依赖收集函数track(targe…

primAlgorithm普利姆算法

primAlgorithm普利姆算法 背景代码实现&#xff08;Java&#xff09; 背景 修路问题&#xff08;最短路径&#xff09; 代码实现&#xff08;Java&#xff09; package test01;import java.util.Arrays;/** 普利姆算法解决修路最短路径的问题* 满足条件为&#xff1a;* 1要把…

【fido2100:工业自动化新标杆——高性能DLR交换机引领精准时间同步新时代】

在现代工业自动化和通信网络中&#xff0c;对于高速、稳定和精准的时间同步有着极高的要求&#xff0c;随着工业4.0的提出和智能制造的发展&#xff0c;工业以太网应运而生&#xff0c;而在工业以太网之中交换机是保证通信稳定的重要的一环。工业以太网交换机广泛应用于工业控制…

html+CSS+js部分基础运用13

一、三级联动 效果如下图所示&#xff1a; 图1 三级联动 二、设计江苏福彩投注站彩票投注助手 编程实现江苏福彩投注站彩票投注助手&#xff0c;页面布局效果如图2所示。 图2福彩投注站彩票助手页面 功能要求如下&#xff1a; 单击“机选1注”、“机选5注”或“机选10注”…

一周速览丨YOLOv10 模型+应用一站式体验!一键部署 Llama 3-Chinese-Chat-8b

公共资源速递 This Weekly Snapshots &#xff01;5 个数据集&#xff1a; Llama3 中文化数据集皮马印第安人糖尿病数据集VehicleID 车辆识别数据集LCCC 大规模净化汉语会话语料库NWPU VHR-10 地理空间物体检测遥感数据集 2 个模型&#xff1a; YOLOv10Llama 3-Chinese-Cha…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心&#xff0c;所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

香港移民政策放开了,2024拿香港身份的8种方式,申请条件解读

​香港移民政策放开了&#xff0c;2024拿香港身份的8种方式&#xff01; 都2024年了&#xff0c;香港身份还受欢迎吗&#xff1f; 当然受欢迎&#xff0c;我们从数据上就能看出来&#xff0c;去年有超过24万人通过各类人才引入计划申请来港&#xff0c;其中超过14万获批&…

三生随记——作家的噩梦

月光斑驳&#xff0c;李轩独坐于老屋的木桌前&#xff0c;四周的静谧被笔尖划过纸张的沙沙声打破。作为一个小有名气的作家&#xff0c;他的文字总是充满魔力&#xff0c;让读者深陷其中。但今晚&#xff0c;他的故事似乎有些不同寻常。 故事的主角&#xff0c;一个名叫林浩的探…

Java虚拟机的优化方法

随着时间的推移&#xff0c;许多优化已经提高了 JVM 的性能。然而&#xff0c;尽管 Java 通常是第一个成功实现它们的虚拟机&#xff0c;但它们也经常被用于其他类似的平台。 1.即时编译 早期的 JVM 总是解释 Java 字节码。在普通应用程序中&#xff0c;Java 的性能损失比 C …

静态网页实现-人脸识别-案例(web)

&#x1f933;人脸识别&#xff08;web) 基于开源大模型&#xff0c;将人脸识别功能整合到网页中&#xff0c;提供用户友好的界面和强大的功能。 核心功能 人脸轮廓识别&#xff1a; 通过深度学习算法&#xff0c;精确识别人脸的轮廓&#xff0c;包括眼睛、鼻子、嘴巴等关键部…