当前位置: 首页 > news >正文

代码随想录算法训练营第二十七天|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. 组合总和 本题是 集合里元素可以用无数次&#xff0c;那么和组合问题的差别 其实仅在于 startIndex上的控制 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应…...

泛型(Generic) <? extends T>,<? super T>

通配符边界引入背景 使用泛型的过程中&#xff0c;经常出现一种很别扭的情况。我们有 Fruit 类&#xff0c;和它的派生类 Apple 类。 class Fruit {}class Apple extends Fruit {}然后有一个最简单的容器&#xff1a;Plate 类。盘子里可以放一个泛型的 “东西”. class Plat…...

数云融合|数字化转型中的利器:揭秘云技术的重要角色

数字化转型不仅是一个流行语&#xff0c;而是一项真正能够改变你的业务流程并提高客户参与度的重要战略。要实现数字化转型&#xff0c;必须重新构建业务流程&#xff0c;同时利用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地址映射关系&#xff1a;…...

《微服务实战》 第九章 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算法的应用题目代码实现 一、暴力匹配法 动画演示 时间复杂度为&#xff1a; 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编程的一般步骤如下&#xff1a; &#xff08;1&#xff09;包含头文件&#xff1a; 在代码中包含必要的头文件&#xff0c;以便使用UDP编程所…...

linux内核篇-进程及其调度

介绍一个程序从源文件到进程执行的过程 1、编译链接&#xff08;源文件到二进制文件&#xff09; Linux 下面二进制的程序也要有严格的格式&#xff0c;称为ELF&#xff08;Executeable and Linkable Format&#xff0c;可执行与可链接格式&#xff09; &#xff0c;这个格式可…...

C#开发的OpenRA游戏之基地工程车执行部署命令

C#开发的OpenRA游戏之基地工程车执行部署命令 前面已经分析接收到网络命令后,可以拿到多个命令对象, 通过命令对象进行遍历,最终会在比较部署命令的类里相同,从而执行部署命令。 可见,网络游戏里的对象操作,都是通过网络发送给服务器,再从服务器返回消息来执行对象的动…...

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经&#xff0c;主要考察了java操作系统mysql网络&#xff0c;这四个方面。 面试流程&#xff0c;共1小时&#xff0c;1min自我介绍&#xff0c;20min写题&#xff0c;剩下问题基础知识。 Java String&#xff0c;StringBuilder&#xff0c; StringBuffer区…...

pro如何添加定时任务

Pro v2.4版本开始后台可以开关控制定时任务&#xff0c;那如何添加新的定时任务呢&#xff1f; 第一步&#xff1a;设置定时任务名称及标识&#xff1b; 文件app\controller\admin\v1\system\SystemTimer中task_name()方法 /**定时任务名称及标识 * return mixed */ public fu…...

bgp路由策略

* - valid 有效的, > - best 最佳的 上图中&#xff0c;有*和>&#xff0c;是有效最佳的。而没有*和没有>&#xff0c;是无效的&#xff0c;下一跳不可达 1--64511是公有AS 64512-65534为私有AS //属于哪个大的联盟 AS200 //连着一个子类AS 65002 //和子…...

chatGPT4.0编写性能测试报告

性能测试报告 测试概述 本次性能测试的目的是评估系统在高负载条件下的性能表现&#xff0c;以确保系统能够满足预期的性能需求。测试过程中&#xff0c;我们关注以下性能指标&#xff1a;响应时间、吞吐量、资源利用率&#xff08;CPU、内存、磁盘、网络&#xff09;以及错误…...

jpa多线程事务

百度都百度不到jpa多线程的事务回滚&#xff0c;废话少说&#xff0c;就是干&#xff0c; 实现思路&#xff08;可看可不看&#xff0c;本人也不喜欢罗里吧嗦的&#xff0c;想直接看干货就跳过这里&#xff0c;直接执行代码&#xff09;&#xff1a; jpa本身是不支持多线程事务…...

加密解密软件VMProtect教程(四):准备项目之SDK功能

VMProtect 是保护应用程序代码免遭分析和破解的可靠工具&#xff0c;但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 SDK 功能可以集成到受保护应用程序的源代码中&#xff0c;以设置受保护区域的边界&#xff0c;以检测调…...

夏令营教育小程序开发功能和优势有哪些?

随着人们生活水平的提高&#xff0c;对于孩子的教育问题也是越来越重视&#xff0c;无论是教育方式还是教育内容上都追求新颖、多样化。在暑假期间&#xff0c;很多家长也希望孩子能够在这个长假期之间参加一些活动&#xff0c;培养孩子兴趣的同时也丰富假期内容&#xff0c;让…...

Cocos CreatorXR 1.2.0 今日发布,正式支持 WebXR ,并开启 MR 之路

去年九月&#xff0c;Cocos CreatorXR v1.0.1 版本支持了 VR 内容创作&#xff0c;成为率先支持 XR 的国产引擎&#xff0c;今年三月&#xff0c;Cocos CreatorXR v1.1.0 版本实现了对 AR 内容开发的支持。在完成基本功能的建设后&#xff0c;更多开发者开始尝试使用 Cocos Cre…...

Linux 使用笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的&#xff0c;当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows&#xff0c;有机会接触 Linux 一般是偶尔在服务器上跑跑程…...

【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2 第二章——安装Atlas 200I DK A2跑通第一个案例

准备相关软件 包括一台PC机&#xff08;空间大于10g)&#xff0c;读卡器&#xff0c;32gsd卡&#xff0c;一根网线。 具体步骤&#xff1a; 开始烧录开发板镜像&#xff1a;将sd卡插入读卡器&#xff0c;将读卡器插入PC机的USB接口&#xff0c;根据相关链接在PC机下载制卡工具…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...