代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串

LeetCode T39 组合总和

题目链接:39. 组合总和 - 力扣(LeetCode)

树形图 

题目思路:

这我们会发现和昨天的题目很像,只是这里的元素并不是只能选取一次了,我们可以根据代码画出树形图来解决问题,下面我们开始递归三部曲

首先我们先定义出result和path数组作为返回值和辅助数组

    List<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();

1.确定回溯函数的参数列表

我们首先肯定要传入candidates数组,因为我们要从中选取元素,传入target,知道我们什么时候要收割正确答案,还要传入一个sum变量来记录我们path中的元素总和,最后是每一层开始可以选取的位置

 public void backtracking(int[] candidates,int target,int num,int startIndex)

2.确定终止条件

这里的终止条件仍然是当target等于sum的时候,我们将收割答案,放到result数组里,当sum比target来的大的时候我们就选择直接return即可

        if(num>target){return;}if(num == target){result.add(new ArrayList(path));return;}

3.确定for循环

这里我们for循环从startindex开始,到candidates数组的大小结束,先向path里面加入元素,sum同步记录,然后进行回溯函数,这里由于candidates数组中的值可以重复取值,这里我们就将下一个取值的起始位置为i,其实也就是这个元素的下标也就是这个取值答案可以向后取的位置,避免重复取值获得[2,3,3] [3,2,3]这样的答案

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

题目代码

class Solution {List<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates,target,sum,0);return result;}int sum = 0;public void backtracking(int[] candidates,int target,int num,int startIndex){if(num>target){return;}if(num == target){result.add(new ArrayList(path));return;}for(int i = startIndex;i<candidates.length;i++){path.add(candidates[i]);sum += candidates[i];backtracking(candidates,target,sum,i);path.remove(path.size()-1);sum -= candidates[i];}}
}

剪枝优化 

其实这道题我们也可以进行剪枝优化的,就是在for循环里面做文章,我们可以先将candidates数组排序,然后如果我们的sum+candidates[i]发现已经大于我们的目标值之后,就可以结束循环了,因为后面不可能再出现我们需要的答案了,这里代码不做过多赘述

LeetCode T40 组合总和II

题目链接: 40. 组合总和 II - 力扣(LeetCode)

tips(我犯的错误) 

错把这个去重当做对candidates数组去重了,实际上第一个1和后面第2个1只是数值相同,并不是可以直接将candidates数组放进set进行去重的,然后使用set对结果集进行去重这种逻辑也很容易超时.

题目思路:

这个题我们引入卡哥的树枝去重和树层去重的概念,树枝去重就是树形图中一次从跟到叶子结点的去重,树层去重就是树的每一层结构中的去重,下面我们先画出树形图

这里我们就发现了树层去重的条件,这里我们以[1,1,2...]举例

这里取第一个1下面的路径已经可以完全包含第二个1的路径,这里我们就可以跳过第二个1对应的循环,这里我们给每个元素对应一个used数组(boolean类型的数组)来定义它的使用情况

我们就会发现满足这样条件的可以直接跳过本轮循环

            if(i>0 && candidates[i] == candidates[i-1] && !used[i-1]){continue;}

回溯三部曲

1.确定参数列表

由于这里的sum和used数组都定义为全局变量了,这里我们就使用candidates数组,target和startIndex作为参数即可

public void backtracking(int[] candidates,int target,int startIndex)

2.确定终止条件

这里和前面一样,不做过多赘述

        if(sum>target){return;}if(sum == target){result.add(new ArrayList(path));}

3.确定for循环

这里进行树层去重

for(int i = startIndex;i<candidates.length;i++){if(i>0 && candidates[i] == candidates[i-1] && !used[i-1]){continue;}used[i] = true;path.add(candidates[i]);sum+=candidates[i];backtracking(candidates,target,i+1);used[i] = false;path.remove(path.size()-1);sum-=candidates[i];}

题目代码:

class Solution {int sum;List<Integer> path = new ArrayList<>();List<List<Integer>> result = new ArrayList<>();boolean used[];public List<List<Integer>> combinationSum2(int[] candidates, int target) {used = new boolean[candidates.length];Arrays.fill(used,false);Arrays.sort(candidates);backtracking(candidates,target,0);return result;}public void backtracking(int[] candidates,int target,int startIndex){if(sum>target){return;}if(sum == target){result.add(new ArrayList(path));}for(int i = startIndex;i<candidates.length;i++){if(i>0 && candidates[i] == candidates[i-1] && !used[i-1]){continue;}used[i] = true;path.add(candidates[i]);sum+=candidates[i];backtracking(candidates,target,i+1);used[i] = false;path.remove(path.size()-1);sum-=candidates[i];}}
}

LeetCode T131 分割回文串

题目链接: 131. 分割回文串 - 力扣(LeetCode)

题目思路:

树形图

这道题有点困难,我们应该模仿组合的思路,一下我列出几个难点,再逐个解决

  • 切割问题可以抽象为组合问题
  • 如何模拟那些切割线 startindex来解决
  • 切割问题中递归如何终止 
  • 在递归循环中如何截取子串
  • 如何判断回文

我们仍然使用回溯三部曲来解决问题,

1.参数列表设计

private void backTracking(String s, int startIndex) {

2.终止条件

这里终止条件就让startindex大于s的长度即可,然后开始收集结果,这里我们判断回文子串的逻辑放在for循环里,从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。

        if (startIndex >= s.length()) {lists.add(new ArrayList(deque));return;}

3.for循环

这里包括了子串的截取,因为每一层startindex是不变的,而i是一直移动的,这里我们就用[startindex,i]这个闭区间代表每个子串

for (int i = startIndex; i < s.length(); i++) {//如果是回文子串,则记录if (isPalindrome(s, startIndex, i)) {String str = s.substring(startIndex, i + 1);deque.addLast(str);} else {continue;}//起始位置后移,保证不重复backTracking(s, i + 1);deque.removeLast();}

4.判断回文

private 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;}

题目代码:

class Solution {List<List<String>> lists = new ArrayList<>();Deque<String> deque = new LinkedList<>();public List<List<String>> partition(String s) {backTracking(s, 0);return lists;}private void backTracking(String s, int startIndex) {//如果起始位置大于s的大小,说明找到了一组分割方案if (startIndex >= s.length()) {lists.add(new ArrayList(deque));return;}for (int i = startIndex; i < s.length(); i++) {//如果是回文子串,则记录if (isPalindrome(s, startIndex, i)) {String str = s.substring(startIndex, i + 1);deque.addLast(str);} else {continue;}//起始位置后移,保证不重复backTracking(s, i + 1);deque.removeLast();}}//判断是否是回文串private 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;}
}

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

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

相关文章

亲,手撸图文博文太累了?试试这个神器!

这一篇博客有关如何使用[InternLM-XComposer]来写图文并茂的博文。InternLM-XComposer是一个基于人工智能的创作工具&#xff0c;它可以根据你的输入生成不同类型的内容&#xff0c;例如文章、诗歌、歌词、代码等。你可以使用它来创作有趣和有创意的博客&#xff0c;同时也可以…

C# OpenCvSharp 利用Lab空间把春天的场景改为秋天

效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class Form1 : Form{public Form1(){InitializeComponent();}st…

免费:实时 AI 编程助手 Amazon CodeWhisperer

点 &#xff0c;一起程序员弯道超车之路 现已正式推出实时 AI 编程助手 Amazon CodeWhisperer&#xff0c;包括 CodeWhisperer 个人套餐&#xff0c;所有开发人员均可免费使用。最初于去年推出的预览版 CodeWhisperer 让开发人员能够保持专注、高效&#xff0c;帮助他们快速、安…

如何管理前端状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

计算机网络中的CSMA/CD算法的操作流程(《自顶向下》里的提炼总结)

具有碰撞检测的载波侦听多路访问&#xff08;CSMA/CD算法&#xff09; 以下内容总结&#xff0c;对应《计算机网络自顶向下第七版》第六章链路层和局域网P299 操作流程&#xff1a; NIC&#xff08;适配器&#xff0c;即网络接口&#xff09;从网络层接收数据报&#xff0c;…

OneDrive打不开了,怎么办?使用管理员身份也无效,分享解决办法如下

文章目录 1、问题描述2、解决办法2.1 修改注册表信息2.2 修改本地组策略 1、问题描述 电脑自带的 OneDrive 突然打不开了&#xff0c;双击也没有任何反应&#xff0c;以管理员身份打开也不行。去看了好多资料才解决这个问题&#xff0c;现分享如下&#xff1b; 2、解决办法 …

用友GRP-U8 SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业&#xff0c;基于云计算技术所推出的新一代产品&#xff0c;是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8的bx_historyDataCheck jsp、slbmbygr.jsp等接口存…

视频批量加水印:保护版权,提升效率

在当今的自媒体时代&#xff0c;视频制作已经成为许多人的一项必备技能。然而&#xff0c;在视频制作过程中&#xff0c;如何为自己的视频添加独特的水印以保护知识产权&#xff0c;常常让许多制作者感到困扰。本文将为你揭示如何通过固乔剪辑助手软件&#xff0c;简单几步批量…

性能测试:测试常见的指标(超详细~)

前言 今天想和大家来聊聊性能测试常见的指标&#xff0c;我在这里也不喜欢说废话我们直接开始吧。 同时&#xff0c;我也为大家准备了一份软件测试视频教程&#xff08;含面试、接口、自动化、性能测试等&#xff09;&#xff0c;就在下方&#xff0c;需要的可以直接去观看&am…

电子器件系列49:CD4050B缓冲器

同相和反向缓冲器 还搞不懂缓冲电路&#xff1f;看这一文&#xff0c;工作原理作用电路设计使用方法 - 知乎 (zhihu.com) 缓冲器_百度百科 (baidu.com) 1、缓冲器的定义 缓冲器是数字元件的其中一种&#xff0c;它对输入值不执行任何运算&#xff0c;其输出值和输入值一样&…

VR智能家居虚拟连接仿真培训系统重塑传统家居行业

家居行业基于对场景的打造及设计&#xff0c;拥有广阔前景&#xff0c;是众多行业里面成为最有可能进行元宇宙落地的应用场景之一。 家居行业十分注重场景的打造及设计&#xff0c;而元宇宙恰恰能通过将人工智能、虚拟现实、大数据、物联网等技术融合提升&#xff0c;带来身临其…

vue使用腾讯地图,实现点标记,搜索

效果图&#xff1a; 1、public文件夹下index.html添加 // public/index.html <script src"https://map.qq.com/api/js?v2.exp&key你的ksy"></script> <script src"https://map.qq.com/api/gljs?v1.exp&librariesservice&key你…

YOLOv5-训练自己的VOC格式数据集(VOC、自建数据集)

YOLOv5&#xff1a;训练自己的 VOC 格式数据集 1. 自定义数据集 1.1 环境安装 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple注意&#xff1a; 安装 lxmlPillow 版本要低于 10.0.0&#xff0c;解释链接: module ‘PIL.Image’ has no attri…

Jetpack:012-Jetpack中的弹出菜单

文章目录 1. 概念介绍2. 使用方法2.1 DropdownMenu2.2 DropdownMenuItem 3. 示例代码3.1 代码和注释3.2 代码难点3.3 运行效果 4. 内容总结 我们在上一章回中介绍了Jetpack中标题栏相关的内容&#xff0c;本章回中主要 弹出菜单。闲话休提&#xff0c;让我们一起Talk Android …

AI系统ChatGPT源码+详细搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅱ—— 创建和添加证书模板

目录 博文摘要3. 使用 Microsoft 证书颁发机构创建 Machine SSL 和 Solution User 证书模板3.1 打开 Certificate Template Console3.2 复制模板3.3 修改 Compatibility 选项卡3.4 修改 General 选项卡3.5 修改 Extensions 选项卡3.6 修改 Subject Name 选项卡3.7 确认新模板 4…

软件工程与计算总结(十六)详细设计的设计模式

一.设计模式基础 某种意义上来说&#xff0c;设计模式就是设计经验的总结~ 设计模式不是简单的经验总结&#xff0c;更不是无中生有&#xff0c;它是经过实践反复检验、能解决关键技术难题、有广泛应用前景和能够显著提高软件质量的有效的经验总结。 每个模式都不是独立的&a…

Docker安装GitLab及使用图文教程

作者&#xff1a; 宋发元 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gitlab/gitlab-ce:15.3.1-ce.0运行GitLa…

Linux性能优化--性能追踪:受CPU限制的应用程序(GIMP)

10.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在受CPU限制的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在受CPU限制的应用程序中明确所有的CPU被哪些源代码行使用。用1trace和oprofile弄清楚应用程序调用各种内部与外部函…

Jmeter接口测试 —— jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…