【回溯算法】【组合问题】Leetcode 77.组合 216. 组合总和 III

【回溯算法】【回溯算法剪枝】 Leetcode 77.组合 216. 组合总和 III

  • 回溯算法可以解决的问题
  • Leetcode 77.组合
    • 解法1 回溯法三部曲,函数参数、终止条件和单层搜索逻辑
    • 解法一plus 回溯法+剪枝
  • 另一道组合回溯问题 216. 组合总和 III
    • 解法:回溯
    • 解法: 回溯+剪枝

回溯算法可以解决的问题

组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等

回溯模板

Leetcode 77.组合

在这里插入图片描述

---------------🎈🎈题目链接🎈🎈-------------------

解法1 回溯法三部曲,函数参数、终止条件和单层搜索逻辑

在这里插入图片描述

class Solution {List<List<Integer>> result = new ArrayList<>();  // 用于汇总单一结果作为最终结果List<Integer> path = new ArrayList<>();    // 用于存放符合条件单一结果public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return result;}public void backtracking(int n, int k, int startindex){ // 1.确定递归函数的参数和返回值// 2.确定终止条件:当最后得到的path的大小等于k 就可以将path存入result中了 终止递归// 注意一下!!这里把path存进result的时候,不能直接存path,不然就是浅拷贝,最后result中的值都一样if(path.size() == k){result.add(new ArrayList<>(path));return;}// 3. 确定横向的单层搜索逻辑 每次搜索都是从startindex开始,startindex保证取过不再取 保证【组合】// for循环用来横向遍历,从左到右取数 取过的数字不再取。递归的过程是纵向遍历,下一层搜索要从i+1开始。// 这里i<=n是因为 数据是范围 [1, n],i就代表了数据,而不是索引for(int i = startindex; i <= n; i++){ // 控制树的横向遍历path.add(i);  // 处理节点:将i加入到path路径中backtracking(n,k,i+1); // 递归:控制树的纵向遍历,注意下一层搜索要从startindex = i+1开始path.removeLast(); // 回溯,撤销处理的节点}} 
}  

注意事项 ⭐️
注意浅拷贝和深拷贝:使用new ArrayList<>(path)
注意移除ArrayList的最后一个元素方法: path.removeLast()

时间复杂度:分析回溯问题的时间复杂度,有一个通用公式:路径长度×搜索树的叶子数。对于本题它等于 O(k⋅C(n,k))

对于给定的n个元素,从中选择k个元素的组合数是C(n, k)。每个组合的平均长度是k(即组合中有k个元素),
在这里插入图片描述

空间复杂度:O(k),递归调用栈最大深度为k(k为要生成的组合的长度)


解法一plus 回溯法+剪枝

在这里插入图片描述

注意事项 ⭐️
注意浅拷贝和深拷贝:使用new ArrayList<>(path)
注意移除ArrayList的最后一个元素方法: path.removeLast()
剪枝优化if(n-(i-startindex)<k) continue; // 剪枝操作 自己写出来所有的变量,就知道了!!!要动手

class Solution {List<List<Integer>> result = new ArrayList<>();  // 用于汇总单一结果作为最终结果List<Integer> path = new ArrayList<>();    // 用于存放符合条件单一结果public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return result;}public void backtracking(int n, int k, int startindex){ // 1.确定递归函数的参数和返回值// 2.确定终止条件:当最后得到的path的大小等于k 就可以将path存入result中了 终止递归// 注意一下这里把path存进result的时候,不能直接存path,不然就是浅拷贝,最后result中的值都一样if(path.size() == k){result.add(new ArrayList<>(path));return;}// 3. 确定横向的单层搜索逻辑 每次搜索都是从startindex开始,startindex保证取过不再取 保证【组合】// for循环用来横向遍历,从左到右取数 取过的数字不再取。递归的过程是纵向遍历,下一层搜索要从i+1开始。// 这里i<=n是因为 数据是范围 [1, n],i就代表了数据,而不是索引for(int i = startindex; i <= n; i++){ // 控制树的横向遍历if(n-(i-startindex)<k) continue;  // 剪枝操作!!!!!!!!!!!!!!!!!!!!!!!!!!path.add(i);  // 处理节点:将i加入到path路径中backtracking(n,k,i+1); // 递归:控制树的纵向遍历,注意下一层搜索要从startindex = i+1开始path.removeLast(); // 回溯,撤销处理的节点}} 
}

另一道组合回溯问题 216. 组合总和 III

相对于77. 组合 (opens new window),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。

本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。

例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。
在这里插入图片描述

解法:回溯

遍历求加和sum,sum=n时,若递归深度为k,则将当前path加入result

if(sum == n){if(path.size() == k){result.add(new ArrayList<>(path));  // 注意新建ArrayList赋值!!!!!!}return; // 如果path.size() == k 但sum != targetSum 直接返回
}

之后进行回溯,sum回溯+path回溯

class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k,n,1);return result;}public void backtracking(int k, int n, int startindex){// 终止条件if(sum == n){if(path.size() == k){result.add(new ArrayList<>(path));}return;}for(int i = startindex; i <= 9; i++){path.add(i);sum += i;backtracking(k,n,i+1);sum -= path.get(path.size()-1);  // 回溯//sum -= i;  // 回溯 这个方法也行path.removeLast(); // 回溯}}
}

解法: 回溯+剪枝

在这里插入图片描述

class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k,n,1);return result;}public void backtracking(int k, int n, int startindex){// 终止条件if(sum >n) return;  // 剪枝 如果sum已经大于n了,那就returnif(sum == n){if(path.size() == k){result.add(new ArrayList<>(path));}return;}for(int i = startindex; i <= 9; i++){path.add(i);sum += i;backtracking(k,n,i+1);sum -= i;  // 回溯path.removeLast(); //回溯}}
}

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

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

相关文章

ArcGIS学习(十一)公服设施服务区划分与评价

ArcGIS学习(十一)公服设施服务区划分与评价 本任务带来的内容是公服设施服务区划分与公服设施服务区评价。本任务包括两个关卡: 公服设施服务区划分公服设施服务区空间价值评价1.公服设施服务区划分 首先,来看看这个案例的场景和基础数据。我们以上海市图书馆为例进行分析…

数据结构(一)——概述

一、绪论 1.1数据结构的基本概念 数据&#xff1a;用来描述客观事物的数、计算机中是字符及所有能输入并被程序识别和处理的符号的集合。 数据元素&#xff1a;数据的基本单位&#xff0c;一个数据元素可由若干数据项组成。 数据结构&#xff1a;指相互之间存在一种或多种特…

VR 全景模式OpenGL原理

VR 全景模式OpenGL原理 VR 全景模式原理 VR 全景模式原理将画面渲染到球面上&#xff0c;相当于从球心去观察内部球面&#xff0c;观察到的画面 360 度无死角&#xff0c;与普通播平面渲染的本质区别在渲染图像部分&#xff0c;画面渲染到一个矩形平面上&#xff0c;而全景需…

啤酒:精酿啤酒与烤串的夜晚滋味

夏日的夜晚&#xff0c;微风拂面&#xff0c;星光璀璨。此时&#xff0c;能抚慰人心的莫过于与三五好友围坐一起&#xff0c;享受烤串与Fendi Club啤酒的美味。这种滋味&#xff0c;不仅仅是味蕾的盛宴&#xff0c;更是心灵的满足。 Fendi Club啤酒&#xff0c;每一滴都蕴含着大…

Apache SeaTunnel 2.3.4 版本发布:功能升级,性能提升

​Apache SeaTunnel团队自豪地宣布2.3.4版本正式发布&#xff01;本次更新聚焦于增强核心功能&#xff0c;改善用户体验&#xff0c;并进一步优化文档质量。 此次版本发布带来了多项重要更新和功能增强&#xff0c;包括核心与API的修复、文档的全面优化、Catalog支持的引入&…

【CSS】(浮动定位)易忘知识点汇总

浮动特性 加了浮动之后的元素,会具有很多特性,需要我们掌握的. 1、浮动元素会脱离标准流(脱标&#xff1a;浮动的盒子不再保留原先的位置) 2、浮动的元素会一行内显示并且元素顶部对齐 注意&#xff1a; 浮动的元素是互相贴靠在一起的&#xff08;不会有缝隙&#xff09;&…

机器学习专项课程03:Unsupervised Learning, Recommenders, Reinforcement Learning笔记 Week02

Week 02 of Unsupervised Learning, Recommenders, Reinforcement Learning 课程地址&#xff1a; https://www.coursera.org/learn/unsupervised-learning-recommenders-reinforcement-learning 本笔记包含字幕&#xff0c;quiz的答案以及作业的代码&#xff0c;仅供个人学习…

YOLOv9独家改进|使用HWD(小波下采样)模块改进ADown

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 HWD是一种下采样模型&#xff0c;应用了小波变换的方法。 ADown是YOLOv9中的下采样模块&#xff0c;对不同的数据场景具有一定的可学…

no declaration can be found for element ‘rabbit:connection-factory‘

spring-mvc 配置 rabbitmq 出现问题。 我的解决方案如下&#xff1a; 1 找到配置文件 spring-rabbitmq.xml 我的配置文件叫&#xff1a;spring-rabbitmq.xml&#xff0c;你们按照自己的查找。 2 定位如下URI 接着 Ctrl鼠标左键 3 确定spring-rabbit-x.x.xsd 按照步骤2 &…

uniapp同步将本地图片转换为base64,支持微信、H5、APP

接上篇&#xff0c;少了一个方法的源代码。 先上代码&#xff1a; ploadFilePromiseSync (url) > { return new Promise((resolve, reject) > { // #ifdef MP-WEIXIN uni.getFileSystemManager().readFile({ filePath: url, encoding: base64, success: res > { let …

Rabbitmq消息丢失-生产者消息丢失(一)

说明&#xff1a;消息生产者在将数据发送到Mq的时候&#xff0c;可能由于网络等原因造成数据投递失败。 消息丢失大致分三种&#xff1a;这里说的是生产者消息丢失&#xff01; 分析原因&#xff1a; 1.有没有一种可能&#xff0c;我刚发送消息&#xff0c;消息还没有到交换…

MySQL中有事务无法回滚的语句?

目录 0.从修改表结构语句开始 1.DDL(Data Definition Language) 数据定义语言 2.DCL(Data Control Language) 数据控制语言 3.在该事务还没提交时开启新事务 4.锁操作 5.行政声明语句 6.主从复制的从机操作 7.如何避免出现隐式提交导致的错误 0.从修改表结构语句开始 试…

tomcat nginx 动静分离

实验目的:当访问静态资源的时候&#xff0c;nginx自己处理 当访问动态资源的时候&#xff0c;转给tomcat处理 第一步 关闭防火墙 关闭防护 代理服务器操作&#xff1a; 用yum安装nginx tomcat &#xff08;centos 3&#xff09;下载 跟tomcat&#xff08;centos 4&#xff0…

Ansible-Playbook

目录 1、概念介绍 roles 角色 playbook 核心元素 ansible-playbook 命令 playbook 简单案例 2、Ansible 变量 自定义变量 facts 变量 Palybook 部署 LAMP ansible 端安装 LAMP playbook 系统环境脚本 构建 httpd 任务 构建 mariadb 任务 构建 php 任务 编写整个任务…

2024年【陕西省安全员C证】考试资料及陕西省安全员C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试资料根据新陕西省安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将陕西省安全员C证模拟考试试题进行汇编&#xff0c;组成一套陕西省安全员C证全真模拟考试试题&#xff0c;学员可通过…

Netty权威指南——基础篇4 网络通信基础

1 TCP粘包/拆包 TCP是个“流”协议&#xff0c;所谓流&#xff0c;就是没有界限的一串数字。可以想象河里流水&#xff0c;是连成一片的&#xff0c;其间没有分界线。TCP底层并不了解上层业务数据的具体含义&#xff0c;它会根据TCP缓冲区的实际情况进行包的划分&#xff0c;一…

Vue.js的单向数据流:让你的应用更清晰、更可控

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

全局渐变滚动条样式

效果如下&#xff1a; APP.vue<style> /* 整个滚动条 */ ::-webkit-scrollbar {width: 5px;height: 10px; } /* 滚动条上的滚动滑块 */ ::-webkit-scrollbar-thumb {background-color: #49b1f5;/* 关键代码 */background-image: -webkit-linear-gradient(45deg,rgba(255,…

使用Go的encoding/asn1库处理复杂数据:技巧与最佳实践

使用Go的encoding/asn1库处理复杂数据&#xff1a;技巧与最佳实践 引言ASN.1 基础ASN.1与Go语言的关系ASN.1数据类型 encoding/asn1库概览主要功能和特性关键API应用场景 基本使用方法序列化&#xff08;编码&#xff09;反序列化&#xff08;解码&#xff09;处理复杂数据结构…

npm、cnpm、pnpm使用详细

简介&#xff1a; npm&#xff1a;npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;用于安装、更新、卸载Node.js的模块和包。它提供了一个命令行界面&#xff0c;使得开发者可以轻松地管理项目依赖。npm 是 nodejs 中的一部分&#xff0c;…