二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

理论

写链表之类的真的很痛苦,赶紧跳到回溯!这次我想结合算法设计这本书,把java版写出来。放在第三部分吧。希望能够在研一完成这项工作!
从一刷总结以下的几个要点:

  1. 回溯方法模板性非常强!!可以解决绝大部分的问题。 (代码随想录的模板非常够用啦)!

  2. 回溯树很重要,要画得出来! (集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。)以下是来自代码随想录的图!来自代码随想录

  3. 剪枝提高效率。

  4. 会涉及排序和组合(组合是不强调元素顺序的,排列是强调元素顺序。)。

  5. 会涉及到重复元素:层和树枝。

理论基础:设置递归函数实现穷举!
模版:常用的参数有(结束条件+解空间),startidx,used;全局的有path和res;函数内的有uset。

void Backtracing(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;Backtracing(路径,选择列表); // 递归回溯,撤销处理结果}
}

1.1 组合:N个数里面按一定规则找出k个数的集合(要用used)

1.2 分割:一个字符串按一定规则有几种切割方式(回文,个数要求,子串?)

1.3 子集:一个N个数的集合里有多少符合条件的子集(组合的子问题)

1.4 排列:N个数按一定规则全排列,有几种排列方式

1.5 棋盘问题:N皇后,解数独等等

1.6 其他

习题

2.1 组合问题

用到的全局变量:这要求熟练掌握ArrayList和List的相关操作,add(元素),remove(索引),size()。

    List<Integer> path  = new ArrayList<Integer>();List<List<Integer>> ans = new ArrayList<List<Integer>>();

再次注意,组合问题要有startidx!
关于StringBuilder的操作

\\Stringlength(), charAt
\\数组String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
StringBuilder path = new StringBuilder();\\初始化
path.append(str.charAt(i));\\增加元素
path.deleteCharAt(path.length() - 1);\\删除元素
ans.add(path.toString());\\转换为String

2.1.1 77. 组合

题目要求在1-n内找到所有可能的k个数的组合。
需要记一下一下代码的时间复杂度,O(n*2^n),目前还不知道怎么算。
代码随想录还给出了剪枝操作,讨论了n和k的关系,对于单次搜索的解空间大小,就是剩下的元素就算全部都枚举也不满足组合的个数要求要求,那么就结束。

for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置
class Solution {List<Integer> path  = new ArrayList<Integer>();List<List<Integer>> ans = new ArrayList<List<Integer>>();public void Backtracing(int k, int startIdx, int n) {if(path.size()==k){ans.add(new ArrayList<>(path));//注意拷贝return;}//组合是无顺序的,需要startidxfor(int i=startIdx; i<=n; i++){path.add(i);Backtracing(k, i+1, n);path.remove(path.size()-1);}}public List<List<Integer>> combine(int n, int k) {path.clear();ans.clear();Backtracing(k, 1, n);return ans;}
}

2.1.2 17. 电话号码的字母组合

这题主要就是2-9个按钮,每个按钮有固定的字母,求给定的一串数字,能打出的所有字母组合。
这样数的深度就是数字的长度,每层的解空间就是数字对应的按钮的字母。
难点在字符串的操作。
Java要用到StringBuilder,因为path如果是String的类无法更改字符。

class Solution {String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};StringBuilder path = new StringBuilder();List<String> ans = new ArrayList<>();public void BackTracing(int depth, String digits){if(depth==digits.length()){ans.add(path.toString());return;}String str = numString[digits.charAt(depth)-'0'];int width = str.length();for(int i=0; i<width; i++){path.append(str.charAt(i));BackTracing(depth+1, digits);path.deleteCharAt(path.length() - 1);}}public List<String> letterCombinations(String digits) {if (digits == null || digits.length() == 0) {return ans;}BackTracing(0, digits);return ans;     }
}

2.1.3 216. 组合总和 III

这题的题目要求是1-9个数字,要求枚举的组合满足:和为n,个数为k,无重复元素。(一般来说,要求越多越好剪枝,和就是一个天然的剪枝条件。)
增加全局变量sum。当然也可以作为一个函数参数。

class Solution {List<List<Integer>> ans = new ArrayList<List<Integer>>();List<Integer> path  = new ArrayList<Integer>();int sum=0;public void Backtracing(int k, int startIdx, int n) {if(path.size()==k&&sum==n){ans.add(new ArrayList<>(path));//注意拷贝return;}//组合是无顺序的,需要startidxfor(int i=startIdx; i <= 9 - (k - path.size()) + 1; i++){if(sum+i>n){return;}path.add(i);sum += i;Backtracing(k, i+1, n);path.remove(path.size()-1);sum -= i;}}public List<List<Integer>> combinationSum3(int k, int n) {path.clear();ans.clear();Backtracing(k, 1, n);return ans;}
}

2.1.4 39. 组合总和

本题要求给的candidates,找到和为target的组合,candidates 中的 同一个 数字可以 无限制重复被选取 。
深度由target控制(剪枝也是,排序,剪枝),宽度是candidate的元素个数。所以我认为不用startIdx了。
但出现这种情况:
在这里插入图片描述
其实是要的,startIdx保证重复选取当前元素,而不重复选取之前的元素,从而避免上述问题。

// 来自代码随想录
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(candidates); // 先进行排序backtracking(res, new ArrayList<>(), candidates, target, 0, 0);return res;}public void backtracking(List<List<Integer>> res, List<Integer> path, int[] candidates, int target, int sum, int idx) {// 找到了数字和为 target 的组合if (sum == target) {res.add(new ArrayList<>(path));return;}for (int i = idx; i < candidates.length; i++) {// 如果 sum + candidates[i] > target 就终止遍历if (sum + candidates[i] > target) break;path.add(candidates[i]);backtracking(res, path, candidates, target, sum + candidates[i], i);path.remove(path.size() - 1); // 回溯,移除路径 path 最后一个元素}}
}

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

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

相关文章

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit3.0勒索病毒解密处理流程

对于企业来说&#xff0c;企业的数据是企业的核心命脉&#xff0c;关乎着企业的生产与运营的所有工作。随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加。近期&#xff0c;云天数据恢复中心接到了很多企业的求助&#xff0c;企业的虚拟机服务器遭到了lockbit3.0勒…

Unity MonoBehaviour 生成dll

dllllllllllllll&#x1f953; &#x1f959;vs创建类库项目&#x1f9c0;添加UnityEngine、UnityEditor引用&#x1f355;添加MonoBehaviour类&#x1f9aa;设置dll生成路径&#x1f37f;生成dll&#x1f354;使用dll中的Mono类 &#x1f959;vs创建类库项目 &#x1f9c0;添加…

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目&#xff0c;将其打包为war8.1.1.5.启动tomcat进…

基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手

文章目录 一、效果演示二、操作步骤三、架构解析 一、效果演示 各位读者你们好&#xff0c;我最近在研究一个语音助手的项目&#xff0c;是基于GPT3.5网页版的逆向和本地BertVits2-2.3 文字转语音&#xff0c;能实现的事情感觉还挺多&#xff0c;目前实现【无需翻墙&#xff0…

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接&#xff08;基本和视频上一致&#xff09; ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方&#xff0c; 1&#xff0c;添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

LaTeX基础使用【系列四】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;LaTeX基础使用 &#x1f984;1 LaTeX的多行数学公式&#x1f420;1.1 导入包&#x1f420;1.2 gather环境&#xff1a;多行公式&#x1f420;1.3 gather\* &#xff1a;无编号公式&#x1…

Codeforces Round 921 (Div. 2)

A. We Got Everything Covered! 题意&#xff1a;有任意由前k个字母组成的长度为n的字符串s1&#xff0c;你需要构建一个字符串s2&#xff0c;使s1恒为s2的子串&#xff08;注意是子串&#xff0c;不是连续子串&#xff09; 分析&#xff1a;我们可以构造n组字符串&#xff0c…

深入Pyecharts:桑基图绘制与炫酷效果实战【第38篇—python:桑基图】

文章目录 深入Pyecharts&#xff1a;桑基图绘制与炫酷效果实战桑基图简介安装 Pyecharts简单桑基图的绘制自定义桑基图的炫酷效果高级样式定制 多组数据桑基图的展示动态桑基图的绘制结合真实数据的桑基图案例导出和分享进阶应用&#xff1a;桑基图与其他图表的组合总结 深入Py…

Ps:渐变编辑器

渐变编辑器 Gradient Editor可用于创建和编辑自定义渐变&#xff0c;它提供了详细的控制选项&#xff0c;能够精确地调整渐变的颜色、样式和效果。 提示&#xff1a; 拖动边框或边角可缩放渐变编辑器窗口。 预设 Presets 提供了大量的渐变预设。还可通过右侧按钮新建 New、导入…

python在线聊天室(带聊天保存)

python Socket在线聊天室(带聊天保存) 需求功能 1.聊天信息保存功能(服务端会把信息保存到一个txt里面) 2.使用pyqt5框架作为一个可视化界面 3.具备一个服务端和多个客户端的功能 4.具备离线加入黑名单(离线踢出) 5.具备在线加入黑名单(在线加入黑名单被踢出) 6.具备群聊功能…

什么是网络?

你是一台电脑&#xff0c;你的名字叫 A 很久很久之前&#xff0c;你不与任何其他电脑相连接&#xff0c;孤苦伶仃。 直到有一天&#xff0c;你希望与另一台电脑 B 建立通信&#xff0c;于是你们各开了一个网口&#xff0c;用一根网线连接了起来。 用一根网线连接起来怎么就能&…

【大数据】Flink 架构(一):系统架构

Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构 1.Flink 组件1.1 JobManager1.2 ResourceManager1.3 TaskManager1.4 Dispatcher 2.应用部署2.1 框架模式2.2 库模式 3.任务执行4.高可用设置4.1 TaskManager 故障4.2 JobManager 故障 Flink 是一个用于状态化并行流处…

第九篇【传奇开心果系列】beeware的toga开发移动应用示例:人口普查手机应用

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、实现应用雏形示例代码四、扩展功能和组件的考量五、添加更多输入字段示例代码六、添加验证功能示例代码七、添加数据存储功能示例代码八、添加数据展示功能示例代码九、…

JavaWeb,Vue的学习(上)

概述 Vue的两个核心功能 声明式渲染&#xff1a;Vue 基于标准 HTML 拓展了一套模板语法&#xff0c;使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。响应性&#xff1a;Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM ViteVue3项目…

Image Enhancement Guided Object Detection in Visually Degraded Scenes

Abstract 目标检测准确率在视觉退化场景下降严重。一个普遍的解决方法就是对退化图像进行增强然后再执行目标检测。但是&#xff0c;这是一种次优的方案&#xff0c;而且未必对目标检测的准确率有提升&#xff0c;因为图像增强和目标检测两个任务的不同。为了解决这个问题&…

elasticsearch8.x版本docker部署说明

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类&#xff1a;一类是线性问题&#xff0c;一类是非线性问题。线性问题是研究最久、理论最完善的&#xff1b;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换&#xff1a; 数域…

【代码随想录-数组】螺旋矩阵 II

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

设计模式:简介及基本原则

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多赢的&#xff0c;设计模式使代码编制真正工程化&#xff…

Jenkins邮件推送配置

目录 涉及Jenkins插件&#xff1a; 邮箱配置 什么是授权码 在第三方客户端/服务怎么设置 IMAP/SMTP 设置方法 POP3/SMTP 设置方法 获取授权码&#xff1a; Jenkins配置 从Jenkins主面板System configuration>System进入邮箱配置 在Email Extension Plugin 邮箱插件…