夸父追日:第七章 回溯算法part02

news/2024/9/19 0:38:16/ 标签: 算法, 数据结构, java

今日收获:组合总和,组合总和Ⅱ,分割回文串

代码随想录:for循环横向遍历,递归纵向遍历,回溯不断调整结果集

1. 组合总和

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

思路:和216. 组合总和 III - 力扣(LeetCode)很像,不同之处在于可以重复选择当前元素,所以递归时start不用+1

方法:

java">class Solution {List<Integer> path=new ArrayList<>();List<List<Integer>> result=new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {// 先进行排序Arrays.sort(candidates);back(candidates,target,0);return result;}public void back(int[] candidates,int target,int start){// 终止if (target==0){result.add(new ArrayList<>(path));return;}for (int i=start;i<candidates.length;i++){if ((target-candidates[i])<0){ // 提前剪枝return;}path.add(candidates[i]);target-=candidates[i];back(candidates,target,i);path.removeLast();target+=candidates[i];}}
}

总结:

        1. 集合中元素可以不断重复,递归中的参数start不加1,表示当前元素还可以在下一层中选

        2. 组合中的元素可以无限多,没有k个限制,for循环终止条件是集合的长度(不再有个数限制的剪枝了)

        3. 求组合总和时可以利用总和大小提前剪枝,再判断要不要选择当前元素(前提:数组已经排好序了,否则当前和大于总和,不能说明之后就没有更小的元素了)

2. 组合总和Ⅱ

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

思路:去重的逻辑:同一层不能选一样的(就是for循环中if判断的逻辑),否则结果一样;但是同一个路径中可以选不同位置的相同元素

方法:

java">class Solution {List<Integer> path=new ArrayList<>();List<List<Integer>> result=new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {// 标记选择的数字是否在同一层使用过int[] used=new int[candidates.length];for (int i=0;i<candidates.length;i++){used[i]=0;}Arrays.sort(candidates);back(candidates,target,0,used);return result;}public void back(int[] candidates,int target,int start,int[] used){if (target==0){  // 终止result.add(new ArrayList<>(path));return;}for (int i=start;i<candidates.length;i++){if (i>0&&candidates[i]==candidates[i-1]&&used[i-1]==0){continue;}if ((target-candidates[i])<0){  // 剪枝return;}path.add(candidates[i]);target-=candidates[i];used[i]=1;back(candidates,target,i+1,used);path.removeLast();target+=candidates[i];used[i]=0;}}
}

总结:使用used数组是为了区分究竟在同一层还是同一条路径上选取相同的元素,如果前一个相同元素已经使用过,那么是同一树枝上;如果前一个相同元素还没有使用过,说明是在同一层上。

3. 分割回文串

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

思路:第一次选择第一个字母,判断是否是回文串,如果是添加到结果集中,如果不是就切割当前字符后面的字符串;后面的字符串切割完成后,StringBuilder添加第二个字符,相当于切割线这次从第二个字符开始切割。注意每次都要传入一个新的StringBuilder对象,表明只有第一次的切割线不断移动位置,后面都是从第一个字符开始切割。

方法:

java">class Solution {List<List<String>> result=new ArrayList<>();List<String> path=new ArrayList<>();public List<List<String>> partition(String s) {back(s,0,new StringBuilder());return result;}public void back(String s,int cut,StringBuilder sb){// 终止if (cut==s.length()){result.add(new ArrayList<>(path));return;}for (int i=cut;i<s.length();i++){sb.append(s.charAt(i));if (isHui(sb.toString())){path.add(sb.toString());back(s,i+1,new StringBuilder());path.removeLast();}}}// 判断字符串是否回文public boolean isHui(String str){int len=str.length();for (int i=0,j=len-1;i<j;i++,j--){if (str.charAt(i)!=str.charAt(j)){return false;}}return true;}
}

总结:

        1. 切割问题可以抽象为组合问题,只要一步步确定分割线

        2. 判断回文子串可以先根据字符串长度剪枝,然后利用相向双指针法(相反方向)

        3. 当切割线移动到右边已经没有字符时,收集结果并返回


http://www.ppmy.cn/news/1519015.html

相关文章

OpenCV小练习:人脸检测

OpenCV自带人脸检测模型&#xff0c;拿来就能用。所以“人脸检测”这个任务对于OpenCV而言真是太简单了——感叹一下&#xff1a;OpenCV太强大了&#xff01;相关的介绍文章在网上可以搜到很多&#xff0c;原本我觉得没必要再写一篇了。结果我在写练习代码的时候&#xff0c;还…

认识人工智能(AI,Artificial Intelligence)

人工智能(AI, Artificial Intelligence)是当今科技领域最引人注目的前沿技术之一。它的影响已渗透到各行各业,从日常生活中的虚拟助手到复杂的工业自动化系统,AI 的应用无处不在。本文将详细探讨人工智能的定义与发展历程、学习人工智能的目的、人工智能在实际生活中的应用…

MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL

#{}和${}区别&#xff1a; #{}&#xff1a;是占位符&#xff0c;采用预编译的方式sql中传值&#xff0c;防止sql注入&#xff0c;如果我们往sql中列值传递一般使用 #{}。 ${}&#xff1a;采用字符串拼接的方式直接拼接到sql语句中&#xff0c;一般不用于sql列值传递&#xf…

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字&#xff1f;识别视频声音转文字技术&#xff0c;不仅极大地提升了信息处理的效率&#xff0c;还促进了跨语言沟通和文化交流。在全球化背景下&#xff0c;它成为了连接不同语言群体的桥梁。此外&#xff0c;随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码&#xff0c;可以让我们直接拿来用 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展&#xff0c;大模型智能体成为热门研究方向&#xff0c;受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…

2024.9.1 刷题总结

2024.9.1 **每日一题** 1450.在既定时间做作业的学生人数&#xff0c;这是一道简单的模拟题&#xff0c;我们只需要判断每个学生的作业时间是否包含询问时间即可&#xff0c;具体判断方法为开始时间小于等于访问时间&#xff0c;结束时间大于等于访问时间。 class Solution { …

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

1 产品简介 SparkShop开源商城&#xff08;也被称为星火商城&#xff09;是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景&#xff0c;包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌&#xff0c;都可以通过Spar…

Ubuntu下安装NVIDIA-SMI

环境 显卡&#xff1a;gt1030 系统&#xff1a;Ubuntu22.04 安装 1、查询显卡GeForce GT 1030 rootapq-K07-C236:/home# lspci 00:00.0 Host bridge: Intel Corporation 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] (rev 0d) 0…

深入理解Java序列化:从入门到实践

在前面的学习中我们简单的学习到了对象流的使用&#xff0c;我们先来回顾一下 对象流 在Java中&#xff0c;对象流是一种特殊的输入输出流&#xff0c;用于处理对象的序列化和反序列化操作。对象流主要包括ObjectOutputStream和ObjectInputStream两个类。 ObjectOutputStrea…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是&#xff1a; 我们要走到最后可以每次都选择尽可能远的来走&#xff0c;其次&#xff0c;能走到该步意味着该步以前都能到达。因此&#xff0c;局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…

uniapp 封装uni.login 实现全局调用

封装utils app.vue中 使用globalData 注册 utils 页面中使用方法 定义app 调用方法

Linux 数据结构 哈希表 排序

哈希表: 哈希: 将数据通过哈希算法映射称为一个键值 存时在键值对应的位置存储 取时通过键值对应的位置查找 哈希冲突&#xff08;哈希碰撞&#xff09;&#xff1a;多个数据通过哈希算法映射成同一个键值 存储数字: 排序算法&#xff1a; 1.冒泡排…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍&#xff0c;后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…