Day20 | 39. 组合总和 40.组合总和II 131.分割回文串

语言

Java

39. 组合总和  

组合总和

题目

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

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

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

思路

本题依然采取递归的方法,我先定义了两个全局变量 一个结果二维数组,一个收集数据的一维数组。在主方法里对数组进行排序,然后进行递归,最后返回结果数组。

递归三部曲 递归参数:target、数组candidates、sum、index

递归终止条件:sum等于target 将合格的数组加入到结果数组中

单层递归:for循环控制结果集大小和遍历次数、递归用来收集数据。

代码

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates);backtracking(candidates, 0, target, 0);return res;}public void backtracking(int[] candidates, int sum, int target, int index) {if (sum == target) {res.add(new ArrayList<>(list));return;}for (int i = index; i < candidates.length; i++) {if (sum + candidates[i] > target) return;sum += candidates[i];list.add(candidates[i]);backtracking(candidates, sum, target, i);sum -= candidates[i];list.removeLast();}}
}

易错点

需要进行剪枝操作,第一步就是数组要排序,第二部在单层递归的时候进行判断,如果sum > target就直接返回。

40.组合总和II

组合总和II

题目

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

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

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

思路

本题依然采取递归的方法,我先定义了两个全局变量 一个结果二维数组,一个收集数据的一维数组。在主方法里对数组进行排序,然后进行递归,最后返回结果数组。

递归三部曲 递归参数:target、数组candidates、sum、index

递归终止条件:sum等于target 将合格的数组加入到结果数组中

单层递归:for循环控制结果集大小和遍历次数、递归用来收集数据。并且递归的index参数变为i+1

需要注意的是本题需要去重,不仅要将list结果去重,并且每个元素只能使用一次。

代码

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backtracking(candidates, target, 0, 0);return res;}public void backtracking(int[] candidates, int target, int sum, int index) {if (sum == target) {res.add(new ArrayList<>(list));return;}for (int i = index; i < candidates.length; i++) {if (sum + candidates[i] > target) return;if (i > index && candidates[i] == candidates[i - 1]) continue;list.add(candidates[i]);sum += candidates[i];backtracking(candidates, target, sum, i + 1);sum -= candidates[i];list.removeLast();}}
}

易错点

需要对list进行去重

如果没有去重重复的list数组

131.分割回文串

分割回文串

题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 

回文串

 。返回 s 所有可能的分割方案。

思路

本题依然采取递归的方法,我先定义了两个全局变量 一个结果二维数组,一个收集字符串的一维数组。在主方法里进行递归,最后返回结果数组。下面递归三部曲。

递归终止条件:分割线大于等于字符串长度,代表切完且判断完了,将字符串数组加到结果数组中。

递归参数:字符串,索引。索引也就代表分割线

单程递归逻辑:判断是否为回文数,如果是就加到字符串数组,不是就继续切割。记得回溯

代码

class Solution {List<List<String>> res = new ArrayList<>();List<String> list = new LinkedList<>();public List<List<String>> partition(String s) {backTracking(s, 0);return res;}public void backTracking(String s, int startIndex) {if (startIndex >= s.length()) {res.add(new ArrayList<>(list));return;}for (int i = startIndex; i < s.length(); i++) {if (isPartition(s, startIndex, i)) {String str = s.substring(startIndex, i + 1);list.add(str);} else {continue;}backTracking(s, i + 1);list.removeLast();}}public boolean isPartition(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;}
}

易错点

终止条件为什么是大于字符串长度一开始我没理解,因为他是代表分割线,而且先进行判断的是不是回文数。

还有这道题用List和Deque都可以。

总结

回溯算法的第二天 接触到了切割。明天继续努力!

博观而约取、厚积而薄发。

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

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

相关文章

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

探索WebKit的CSS表格布局:打造灵活的网页数据展示

探索WebKit的CSS表格布局&#xff1a;打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式&#xff0c;它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎&#xff0c;提供了对CSS表格布局的全面支持。本文将深入探讨…

qt 如何制作动态库插件

首先 首先第一点要确定我们的接口是固定的&#xff0c;也就是要确定 #ifndef RTSPPLUGIN_H #define RTSPPLUGIN_H #include "rtspplugin_global.h" typedef void (*func_callback)(uint8_t* data,int len,uint32_t ssrc,uint32_t ts,const char* ipfrom,uint16_t f…

【前端学习笔记】CSS基础一

一、什么是CSS 1.CSS 介绍 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用来控制网页布局和设计外观的样式语言。它使得开发者可以分离网页的内容&#xff08;HTML&#xff09;和表现形式&#xff08;样式&#xff09;&#xff0c;提高了…

Spring Security 介绍

1.概要 Spring Security是一个用于在Java应用程序中实现身份验证和访问控制的强大框架。它可以轻松地集成到任何基于Spring的应用程序中&#xff0c;提供了一套丰富的功能来保护应用程序的安全性。 https://spring.io/projects/spring-security/ demo:https://docs.spring.i…

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器&#xff0c;不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject&#xff0c;属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…

美团后端二面

美团后端二面 ……………………………… 两道场景 一道 数字转中文读法&#xff08;1000-》一千&#xff09; 0八股0自我介绍 反问 “您觉得我能过吗&#xff1f;” “这个需要横行对比之后才能有结果” ……………………………… 什么时候到岗 场景题 1 假设我有一个…

ETL工程师角度下的SQL优化

作为ETL&#xff08;Extract, Transform, Load&#xff09;工程师&#xff0c;SQL优化是提高数据处理和分析效率的关键一环。优化SQL查询可以显著降低数据处理时间&#xff0c;提高ETL过程的性能。本文将从 合理设计数据模型&#xff1a;在ETL过程中&#xff0c;正确的数据模型…

主从DNS服务器

实验 3 &#xff1a;主从 DNS 服务器 将一个区域文件复制到多个服务器上的过程叫做区域传送。将主服务器上的信息复制到辅助服务器上来 实现。 &#xff08; 1 &#xff09;完全区域传送&#xff1a;复制整个区域文件 查看日志 # 主 DNS 服务器的配置【主 dns 服务器的 ip 地…

【STM32 HAL库】ADC

ADC&#xff0c;顾名思义就是模拟信号->数字信号ADC工作原理 分类&#xff1a; 并联比较型-----转换速度快-----成本高、功耗高、分辨率低 分压部分比较部分编码部分&#xff08;其中Vx为模拟电压输入 &#xff09; 逐次逼近型-----结构简单&#xff0c;功耗低-----转换速…

Preact:轻量级替代React的选择

Preact是一个轻量级的JavaScript库&#xff0c;它提供了与React相似的API&#xff0c;但体积更小&#xff0c;性能更优。Preact的核心理念是尽可能地保持与React的兼容性&#xff0c;同时去除不必要的部分&#xff0c;使其成为一个理想的替代品&#xff0c;尤其是在对性能和包大…

C++STL详解(三)——vector类的接口详解

目录 一.vector的介绍 二.vector的构造以及赋值 2.1构造函数 2.2operator重载 三.vector的空间操作 3.1capacity和size函数 3.2reserve和resize函数 3.3empty函数 四.vector迭代器相关函数 4.1begin和end函数 4.2rbegin和rend函数 五.vector的增删查改 5.1push_back和…

web前端 React 框架面试200题(一)

面试题 1. 简述什么是React &#xff08; 概念 &#xff09;&#xff1f; 参考回答&#xff1a; 1、React是Facebook开发的一款JS库。 2、React一般被用来作为MVC中的V层&#xff0c;它不依赖其他任何的库&#xff0c;因此开发中&#xff0c;可以与任何其他的库集成使用&…

QT串口和数据库通信

创建串口 串口连接客户端并向服务器发送消息 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network QT core gui…

【React】箭头函数:现代 JavaScript 的高效编程方式

文章目录 一、箭头函数的基本语法二、箭头函数的特性三、在 React 中的常见用法四、最佳实践 在现代 JavaScript 中&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一种简洁的函数表达方式&#xff0c;并且在 React 开发中非常常见。箭头函数不仅简化了函数的语…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

前端开发知识(三)-javascript

javascript是一门跨平台、面向对象的脚本语言。 一、引入方式 1.内部脚本&#xff1a;使用<script> &#xff0c;可以放在任意位置&#xff0c;也可以有多个&#xff0c;一般是放在<body></body>的下方。 2.外部脚本&#xff1a;单独编写.js文件&#xff…

【HarmonyOS】应用设置屏幕常亮

【HarmonyOS】应用设置屏幕常亮 一、问题背景&#xff1a; 金融类或钱包场景的应用APP&#xff0c;对于付款码&#xff0c;扫一扫等场景都会对屏幕设置常亮。防止屏幕长时间不操作&#xff0c;自动息屏。 目前这种场景的需求也是非常有必要的&#xff0c;也是行业内默认的处理…

Spark 解析嵌套的 JSON 文件

1、什么是嵌套的JSON文件&#xff1f; 嵌套的JSON文件是指文件中包含了嵌套的JSON对象或数组。例如&#xff0c;以下是一个嵌套的JSON文件的示例&#xff1a; {"name": "John","age": 30,"address": {"street": "123…

解码目标检测:可解释性的关键角色

解码目标检测&#xff1a;可解释性的关键角色 在人工智能的浪潮中&#xff0c;目标检测作为计算机视觉领域的一个核心任务&#xff0c;已经取得了显著的进展。然而&#xff0c;随着深度学习模型在这一领域的广泛应用&#xff0c;模型的可解释性逐渐成为研究者关注的焦点。本文…