代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131

文章目录

    • Day 25
      • 01. 组合总和(No. 39)
        • 1.1 题目
        • 1.2 笔记
        • 1.3 代码
      • 02. 组合求和 II(No. 40)
        • 2.1 题目
        • 2.2 笔记
        • 2.3 代码
      • 03. 分割回文串(No. 131)
        • 3.1 题目
        • 3.2 笔记
        • 3.3 代码

Day 25

01. 组合总和(No. 39)

题目链接

代码随想录题解

1.1 题目

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40
1.2 笔记

本题需要求得能使得总和为 target 的结果的集合,和之前的组合的题目非常类似

代码随想录刷题笔记 DAY 25 | 组合问题 No.77 | 组合求和III No.216 | 电话号码的字母组合 No.17

但需要本题的区别是:可以取得相同的元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一开始写的时候没有画图,导致写出了这样的代码

for (int i = 0; i < arr.length; i++) {path.add(arr[i]);sum += i;backtracking();path.remove(path.size() - 1);sum -= i;
}

导致结果出现了 2 2 33 2 2 这样的重复情况。

其实参考上图很容易看出来,对于一个节点的遍历从数组中这节点开始的,所以对于 i 应该限制 startIndex,所以 如果是一个集合求组合 的题目一定要加上 startIndex;

更改代码为:

for (int i = index; i < candidates.length; i++) {path.add(candidates[i]);temp += candidates[i];backtarcking(candidates, target, i);temp -= candidates[i];path.remove(path.size() - 1);
}

写出完整的代码

1.3 代码
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();int temp = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates, target, 0);return res;}public void backtracking(int[] candidates, int target, int index) {if (temp > target) {index++;return;}if (temp == target) {index++;res.add(new ArrayList(path));}for (int i = index; i < candidates.length; i++) {path.add(candidates[i]);temp += candidates[i];backtracking(candidates, target, i);temp -= candidates[i];path.remove(path.size() - 1);}}
}

02. 组合求和 II(No. 40)

题目链接

代码随想录题解

2.1 题目

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

**注意:**解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

提示:

  • 1 <= candidates.length <= 100
  • 1 <= candidates[i] <= 50
  • 1 <= target <= 30
2.2 笔记

这道题目与之前接触到的组合的问题不同的点在于数组中出现了相同的元素,这就会导致这种情况:

所以要进行去重的操作
❓ 但很容易发现这次的去重好像和之前的不相同?

💡 之前的去重操作是通过控制 i = index,通过每次递归修改 i 的值来使得不会取得相同的元素

也就是对一个 路径 去做去重操作;但本题显然是不只是需要对路径进行去重,还需要对 一层中 遍历到相同的元素的时候进行去重操作。

所以在进行一层中的分枝操作也就是 for 循环遍历的时候,有些节点需要 跳过,比如上图中的两个 2 节点,剩下的内容其实和其他的组合问题没什么区别。

如果要跳过的话首先要对数组进行排序(将相同的数字放到一起),在执行 for 循环的时候,如果遇到和前面相同的就跳过。

for (int i = index; i < candidates.length; i++) {if ( i > index && candidates[i] == candidates[i - 1] ) {continue;}// 其他逻辑
}
2.3 代码
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();int temp = 0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backtracking(candidates, target, 0);return res;}public void backtracking(int[] candidates, int target, int index) {if (temp > target) {return;}if (temp == target) {res.add(new ArrayList<>(path));return;}for (int i = index; i < candidates.length; i++) {if ( i > index && candidates[i] == candidates[i - 1] ) {continue;}temp += candidates[i];path.add(candidates[i]);backtracking(candidates, target, i + 1);temp -= candidates[i];path.remove(path.size() - 1);}}
}

03. 分割回文串(No. 131)

题目链接

代码随想录题解

3.1 题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:

输入:s = “a”
输出:[[“a”]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成
3.2 笔记

分割字符串和组合问题非常类似,先将树形结构画出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在一层中,遍历的是本层的 字符串 的所有的切割情况,而向下层传递的是 切割后 的字符串的所有的切割情况,其实和组合问题是十分类似的。

单层中切割通过遍历来完成,比如 aab 在第一个 a 的位置切割就是通过将字符串从 starti 来分割

for (int i = startIndex; i < s.length(); i++) {s.substring(startIndex, i + 1); // 单层中切割字符串
}

通过 i 逐步遍历到最后实现了 本层所有切割情况

❓ 那什么时候说明本层的这种切割情况 可能 能够获得最终的结果呢?

答案就是本层的这种切割方式切割的部分是回文串,也就是从 startIndexi 这一部分

所以需要一个方法来判断这种切割是否是回文串

    /**判断是否是回文字符串*/public boolean isValid(String s, int startIndex, int endIndex) {char[] charArray = s.toCharArray();for (int i = startIndex, j = endIndex; i < j; i++, j--) {if (charArray[i] != charArray[j]) {return false;}}return true;}

通过双指针的遍历方式来确定回文串

如果是回文串的话就继续向深层次递归,反之则取遍历本层的其他可能性

if (isValid(s, startIndex, i)) {path.add(s.substring(startIndex, i + 1));
} else {continue;
}
backtracking(i + 1, s);
path.remove(path.size() - 1);

再来确定递归的终点:

如果 startIndex >= s.length() 的话,就说明已经找到一种情况了因为此时已经分割完成了所有的字符串,如果分割途中出现了非回文字符串就会通过 continue 跳过而不可能使得 startIndex == 0

3.3 代码
class Solution {List<String> path = new ArrayList<>();List<List<String>> res = new ArrayList<>();public List<List<String>> partition(String s) {backtracking(0, s);return res;}public void backtracking(int startIndex, String s) {if (startIndex >= s.length()) {res.add(new ArrayList(path));return;}for (int i = startIndex; i < s.length(); i++) {if (isValid(s, startIndex, i)) {path.add(s.substring(startIndex, i + 1));} else {continue;}backtracking(i + 1, s);path.remove(path.size() - 1);}}/**判断是否是回文字符串*/public boolean isValid(String s, int startIndex, int endIndex) {char[] charArray = s.toCharArray();for (int i = startIndex, j = endIndex; i < j; i++, j--) {if (charArray[i] != charArray[j]) {return false;}}return true;}
}

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

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

相关文章

Java入门高频考查基础知识9(银盛15问万字参考答案)

JAVA刷题专栏&#xff1a;http://t.csdnimg.cn/9qscL 目录 一、Springcloud的工作原理 三、注册中心心跳是几秒 四、消费者是如何发现服务提供者的 五、多个消费者调⽤用同⼀接口&#xff0c;eruka默认的分配⽅式是什么 六、springboot常用注解&#xff0c;及其实现 七、…

ClickHouse--10--临时表、视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 1.临时表 1.1 特征 ClickHouse 支持临时表&#xff0c;临时表具备以下特征&#xff1a; 当…

【JAVA WEB】JavaScript(WebAPI)--DOM基本概念 获取元素 点击事件 键盘事件

目录 什么是WebAPI DOM的基本概念 DOM是什么 DOM树 获取元素 querySelector querySelectorAll 事件 事件初识 基本概念 事件三要素 点击事件 键盘事件 什么是WebAPI 前端学习的 JS 分成三个大的部分 ECMAScript&#xff1a;基础语法部分DOM API&#xff1a;操作…

鸿蒙开发系列教程(十九)--页面内动画(2)

组件内转场动画 组件的插入、删除过程即为组件本身的转场过程&#xff0c;组件的插入、删除动画称为组件内转场动画。通过组件内转场动画&#xff0c;可定义组件出现、消失的效果。 transition(value: TransitionOptions) 参数可以定义平移、透明度、旋转、缩放这几种转场样…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第一套(完善程序题)

CCF认证CSP-J入门组模拟测试题第一套 三、完善程序题 第一题 九宫格 请完善下面的程序,将1~9个数字分别填人3x3的九宫格中,第一行的三个数字组成一个三位数。要使第二行的三位数是第一行的2倍,第三行的三位数是第一行的3倍且每个格子里的数字都不能重复,现在要求输出所有的填…

视觉slam十四讲学习笔记(四)相机与图像

理解理解针孔相机的模型、内参与径向畸变参数。理解一个空间点是如何投影到相机成像平面的。掌握OpenCV的图像存储与表达方式。学会基本的摄像头标定方法。 目录 前言 一、相机模型 1 针孔相机模型 2 畸变 单目相机的成像过程 3 双目相机模型 4 RGB-D 相机模型 二、图像…

【JavaEE】网络原理: UDP协议和TCP协议的相关内容

目录 1. 应用层 2. 传输层 2.1 端口号 2.2 UDP协议 2.3 TCP协议 1.确认应答 2.超时重传 3.连接管理 三次握手 四次挥手 状态转换 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 9.面向字节流 粘包问题 10.异常情况 网络通信中, 协议是一个非常重…

第二十九回 施恩三入死囚牢 武松大闹飞云浦-分布式版本控制系统Git使用

武松要蒋门神答应三件事&#xff1a;离开快活林、东西都归还施恩&#xff0c;公开对施恩赔礼道歉&#xff0c;不许在孟州住。蒋门神不得已都答应了&#xff0c;灰溜溜地离开了孟州城。 一个月之后&#xff0c;天气转凉&#xff0c;张都监调武松到孟州城&#xff0c;做了他的亲…

统计图饼图绘制方法(C语言)

统计图饼图绘制方法&#xff08;C语言&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图绘制较难。今值此介绍饼图的绘制方法。 本方法采用C语言的最基本功能&#xff1a; &#xff08; 1.&#xff09…

数据结构在JavaScript中的体现

一.概述 数据结构是计算机中存储、组织数据的方式。通常情况下&#xff0c;精心选择的数据结构可以带来最优效率的算法&#xff0c;其实算法并不是一个很高级的东西&#xff0c;它充斥在每一种代码组织方式中&#xff1b;而且各种语言关于数据结构方面的内容都是大同小异的&…

【复现】某某ERP 信息泄露漏洞_49

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该ERP基于SpringBoot框架和SaaS模式&#xff0c;立志为中小企业提供开源好用的ERP软件&#xff0c;目前专注进销存财务生产功能。…

七天入门大模型 :LLM大模型基础知识最全汇总

七天入门LLM大模型学习 旨在帮助初学者理解和学习LLM的基础概念和实践。 未来七天&#xff0c;我将每天为大家推出一篇课程内容&#xff0c;感兴趣的小伙伴们可关注我们 文章目录 技术交流群用通俗易懂方式讲解系列基础模型研究模型定制新范式LLM类型介绍多模态模型Agent模型C…

【MySQL】待修改

外键约束 含义 外键&#xff1a;用来让两张表的数据之间建立连接&#xff0c;从而保证数据的完整性和一致性。 员工表emp&#xff08;子表&#xff09; idnameagejobsalaryentrydatemanageriddept_id1金庸66总裁200002000-01-01null52张无忌20项目经理125002005-12-05113杨…

lv15 平台总线驱动开发——ID匹配 3

一、ID匹配之框架代码 id匹配&#xff08;可想象成八字匹配&#xff09;&#xff1a;一个驱动可以对应多个设备 ------优先级次低&#xff08;上一章名称匹配只能1对1&#xff09; 注意事项&#xff1a; device模块中&#xff0c;id的name成员必须与struct platform_device中…

猫头虎分享已解决Bug || ValueError: No gradients provided for any variable

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2019年通信工程师初级 实务 真题

文章目录 一、第9章 通信动力与环境通信电源系统的主要功能&#xff1a;“供”、“配”、“储”、“发”、“变” 二、第2章 传输网三、第3章 接入网四、第4章 互联网 一、第9章 通信动力与环境 【问题一】 网络通信设备对动力与环境的质量要求可以归纳为 &#xff08;1&#…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒处理流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利保障&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;并且企业的发展离不开数据支撑&#xff0c;重视数据安全成为了众多企业关心的主要话题。春节前后&#xff0c;云天数据恢复中心接到很多企业的求…

C++:IO流

目录 关于CIO流 C/C中的日期输入 连续输入的问题 C文件IO流 运算符>>的运用 二进制读写 文本读写 stringstream 关于CIO流 C系统中ios为基类&#xff0c;其他类都是直接或间接派生自ios类 C标准库提供了4个全局流对象cin、cout、cerr、clog (在使用时候必须要包…

LeetCode刷题计划

LeetCode刷题计划 推荐 代码随想录&#xff1a;https://github.com/youngyangyang04/leetcode-master 卡码网 练习ACM模式 https://kamacoder.com/ 01 #include <iostream> using namespace std;int main() {int a ,b;while(cin>>a>>b){cout<<ab<…

【AI视野·今日CV 计算机视觉论文速览 第293期】Fri, 19 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 19 Jan 2024 Totally 103 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers ParaHome: Parameterizing Everyday Home Activities Towards 3D Generative Modeling of Human-Object Interactions Aut…