代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串
目录
39. 组合总和
40.组合总和II
131.分割回文串
39. 组合总和
本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制
题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili
题解思路:
这是基本的回溯算法求组合问题的代码思路,没有什么问题,能ac就是说,记录第一次不看题解写题,思想就是暴力算法的本质,剪枝条件的优化套路其实差不多,这里就是多了一个先对数组进行升序排序的操作,好更加有利于剪枝条件作判断!!!
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates); //使用Arrays工具类对给定的数组先按升序排列,好让回溯方法里面的剪枝条件作快速判断backtracking(candidates,target,0);return result;}public void backtracking(int[] candidates, int target, int satart){if(sum > target) return; //先对数组进行升序排序,可以更加对其作判断,不加也没事就是说if(sum == target){result.add(new LinkedList<Integer>(path));return;}for(int i = satart; i < candidates.length; i++){path.add(candidates[i]);sum += candidates[i];backtracking(candidates,target,i); //这里是i因为避免取到重复的组合path.removeLast();sum -= candidates[i];}}
}
40.组合总和II
本题开始涉及到一个问题了:去重。
注意题目中给我们 集合是有重复元素的,那么求出来的 组合有可能重复,但题目要求不能有重复组合。
题目链接/文章讲解:代码随想录
题解思路:
本题主要在于去重条件操作的理解,这很重要!!!然后就是整体思路和求组合问题差不多,具体的去重操作理解可以分成两种:树层去重和树枝去重,以本题结合代码注释为例说明如下:
第一种树层去重:used[i - 1] == false --> 说明此时第一轮递归已经结束了,此时整个if语句的判断条件意思是:当第二轮开始递归的开头元素和第一轮开始的递归的开头元素相同时,直接跳过此轮递归,因为之前那一轮已经包括了所有种以1开头的组合;
第二种树枝去重:used[i - 1] == true --> 说明此时还在第一轮里面,此时整个if语句的判断条件意思是:当在第一轮搜索所有的组合过程中,如果遇到和前一个元素相同时,直接跳过相邻元素相同组合的搜索,这就意味着不会出现 [ 1 1 6]这种组合了,显然是错误的
最后想分享的就是,可以多看卡哥视频讲解的思路,再自己好好去理解这两种情况!!!
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();int sum = 0;boolean[] used;public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates); //先对数组进行排序used = new boolean[candidates.length]; //定义一个和给定数组相同大小、具有标记功能的数组Arrays.fill(used, false); //使用used数组标记之前是否使用过元素,0表示未使用过,1表示使用过backtracking(candidates, target, 0);return result;}public void backtracking(int[] candidates, int target, int start){if(sum > target) return;if(sum == target){result.add(new LinkedList<Integer>(path));return;}for(int i = start; i < candidates.length; i++){if(i > 0 && candidates[i - 1] == candidates[i] && used[i - 1] == false) continue; //used[i - 1] == false:树层去重操作;used[i - 1] == true:树枝去重操作//这里可以这么去理解这种判断条件:(以第一轮和第二轮递归说明,给定的排序后的数组为[1 1 2 5 6 7],target = 8)//used[i - 1] == false --> 说明此时第一轮递归已经结束了,此时整个if语句的判断条件意思是:当第二轮开始递归的开头元素和第一轮开始的递归的开头元素相同时,直接跳过此轮递归,因为之前那一轮已经包括了所有种以1开头的组合;//used[i - 1] == true --> 说明此时还在第一轮里面,此时整个if语句的判断条件意思是:当在第一轮搜索所有的组合过程中,如果遇到和前一个元素相同时,直接跳过相邻元素相同组合的搜索,这就意味着不会出现 [ 1 1 6]这种组合了,显然是错误的used[i] = true;path.add(candidates[i]);sum += candidates[i];backtracking(candidates, target, i + 1);used[i] = false; //递归之后一定要回溯,这是不能忘的!把之前使用过的元素重新都标记为0,开始下一次的递归搜索path.removeLast();sum -= candidates[i];}}
} 131.分割回文串
本题较难,大家先看视频来理解 分割问题,明天还会有一道分割问题,先打打基础。
题目链接/文章讲解:代码随想录
题解思路:
本题还是有难度的,需要把切割的动作抽象成组合的问题,多看卡哥视频里面讲解的思路,捋清之后再下手写执行代码!!!卡哥里面说的思路还是很清楚的,多品味品味就好!!!代码具体注意的事项看注释,如何把切割动作抽象成组合问题,卡哥视频说的很详细,移动到卡哥视频就行!!!
class Solution {LinkedList<String> path = new LinkedList<>();List<List<String>> result = new ArrayList<>();public List<List<String>> partition(String s) {backtracking(s, 0);return result;}public void backtracking(String s, int startIndex){if(startIndex >= s.length()){ result.add(new LinkedList<String>(path));return;}for(int i = startIndex; i < s.length(); i++){if(isPalindrome(s, startIndex, i)){ //如果索引的范围内的子串是回文串,则直接切割子串及时添加到path路径里面,这里使用下标直接进行切割数组的操作,不用装到容器里面判断String temp = s.substring(startIndex, i + 1); //startIndex是固定不变的,而i会在每轮递归的时候都会进行i++操作,主要substring(start,end)是左闭右开的path.add(temp);}else{continue;}backtracking(s, i + 1); //下一轮递归的时候i = i+1, 保证不会重复切割path.removeLast();}}public boolean isPalindrome(String s, int startIndex, int end){for(int i = startIndex, j = end; i < j; i++, j--){if(s.charAt(i) != s.charAt(j)){return false;}}return true;}} 相关文章:
代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串
目录 39. 组合总和 40.组合总和II 131.分割回文串 39. 组合总和 本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和(对应…...
泛型(Generic) <? extends T>,<? super T>
通配符边界引入背景 使用泛型的过程中,经常出现一种很别扭的情况。我们有 Fruit 类,和它的派生类 Apple 类。 class Fruit {}class Apple extends Fruit {}然后有一个最简单的容器:Plate 类。盘子里可以放一个泛型的 “东西”. class Plat…...
数云融合|数字化转型中的利器:揭秘云技术的重要角色
数字化转型不仅是一个流行语,而是一项真正能够改变你的业务流程并提高客户参与度的重要战略。要实现数字化转型,必须重新构建业务流程,同时利用AI、物联网、AR、ML、大数据分析等先进技术不断提升客户参与度。这就需要利用云技术提供的强大计…...
Linux篇2
Linux 0. 终端提示信息1. 文件目录结构1.1 文件目录 2. 文本编辑器VI/VIM2.1 VIM编辑器2.1 一般模式2.2 编辑模式2.3 命令模式 3. 网络配置3.1 VMware提供的三种网络连接模式3.2 静态配置网络IP地址3.3 配置主机名3.3.1 修改主机名3.3.2 配置主机名-IP地址映射关系:…...
《微服务实战》 第九章 Gitlab使用
前言 微服务项目,常常需要多人协作完成工作,本章教程是介绍Gitlab使用,使多人协作告别低端的手动拷贝,也告别传统的SVN。 1、下载安装git https://git-scm.com/download/win 1.1、安装好以后,cmd中输入git 2、生成ssh-key ssh-keygen -t rsa -C “zhangsan@163.com”…...
KMP匹配算法
目录 一、暴力匹配法动画演示代码实现 二、KMP算法的概念三、KMP算法的应用题目代码实现 一、暴力匹配法 动画演示 时间复杂度为: O ( m ∗ n ) O(m * n) O(m∗n) 代码实现 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;int…...
ClickHouse笔记: Ubuntu/Centos下的安装, 配置和用户管理
ClickHouse ClickHouse 属于 OLAP 数据库 OLTP 与 OLAP OLTP (On-Line Transaction Processing 联机事务处理), 注重事务处理, 数据记录的性能和安全性OLAP (On-Line Analytical Processing 联机分析处理), 注重数据分析, 重点在查询的性能 一般使用 OLTP 数据库做业务数据…...
网络编程——UDP编程
UDP编程 UDP编程步骤通信流程serverclient 函数接口socketbindrecvfromsendto 举例UDP客户端UDP服务器 UDP编程步骤 在C语言中进行UDP编程的一般步骤如下: (1)包含头文件: 在代码中包含必要的头文件,以便使用UDP编程所…...
linux内核篇-进程及其调度
介绍一个程序从源文件到进程执行的过程 1、编译链接(源文件到二进制文件) Linux 下面二进制的程序也要有严格的格式,称为ELF(Executeable and Linkable Format,可执行与可链接格式) ,这个格式可…...
C#开发的OpenRA游戏之基地工程车执行部署命令
C#开发的OpenRA游戏之基地工程车执行部署命令 前面已经分析接收到网络命令后,可以拿到多个命令对象, 通过命令对象进行遍历,最终会在比较部署命令的类里相同,从而执行部署命令。 可见,网络游戏里的对象操作,都是通过网络发送给服务器,再从服务器返回消息来执行对象的动…...
米哈游的春招实习面经,问的很基础
米哈游的春招实习面经,主要考察了java操作系统mysql网络,这四个方面。 面试流程,共1小时,1min自我介绍,20min写题,剩下问题基础知识。 Java String,StringBuilder, StringBuffer区…...
pro如何添加定时任务
Pro v2.4版本开始后台可以开关控制定时任务,那如何添加新的定时任务呢? 第一步:设置定时任务名称及标识; 文件app\controller\admin\v1\system\SystemTimer中task_name()方法 /**定时任务名称及标识 * return mixed */ public fu…...
bgp路由策略
* - valid 有效的, > - best 最佳的 上图中,有*和>,是有效最佳的。而没有*和没有>,是无效的,下一跳不可达 1--64511是公有AS 64512-65534为私有AS //属于哪个大的联盟 AS200 //连着一个子类AS 65002 //和子…...
chatGPT4.0编写性能测试报告
性能测试报告 测试概述 本次性能测试的目的是评估系统在高负载条件下的性能表现,以确保系统能够满足预期的性能需求。测试过程中,我们关注以下性能指标:响应时间、吞吐量、资源利用率(CPU、内存、磁盘、网络)以及错误…...
jpa多线程事务
百度都百度不到jpa多线程的事务回滚,废话少说,就是干, 实现思路(可看可不看,本人也不喜欢罗里吧嗦的,想直接看干货就跳过这里,直接执行代码): jpa本身是不支持多线程事务…...
加密解密软件VMProtect教程(四):准备项目之SDK功能
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 SDK 功能可以集成到受保护应用程序的源代码中,以设置受保护区域的边界,以检测调…...
夏令营教育小程序开发功能和优势有哪些?
随着人们生活水平的提高,对于孩子的教育问题也是越来越重视,无论是教育方式还是教育内容上都追求新颖、多样化。在暑假期间,很多家长也希望孩子能够在这个长假期之间参加一些活动,培养孩子兴趣的同时也丰富假期内容,让…...
Cocos CreatorXR 1.2.0 今日发布,正式支持 WebXR ,并开启 MR 之路
去年九月,Cocos CreatorXR v1.0.1 版本支持了 VR 内容创作,成为率先支持 XR 的国产引擎,今年三月,Cocos CreatorXR v1.1.0 版本实现了对 AR 内容开发的支持。在完成基本功能的建设后,更多开发者开始尝试使用 Cocos Cre…...
Linux 使用笔记(本人出品,必属精品)
文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的,当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows,有机会接触 Linux 一般是偶尔在服务器上跑跑程…...
【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2 第二章——安装Atlas 200I DK A2跑通第一个案例
准备相关软件 包括一台PC机(空间大于10g),读卡器,32gsd卡,一根网线。 具体步骤: 开始烧录开发板镜像:将sd卡插入读卡器,将读卡器插入PC机的USB接口,根据相关链接在PC机下载制卡工具…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
