代码随想录第23天|回溯

39.组合总和

题目链接/文章讲解: 代码随想录

视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili

第一想法:

组合总和与第22天组合总和III的区别在于元素可以重复,其实仅在于 startIndex上的控制,从图中可以看出startIndex不再+1。

所以startIndex +1 作用:是确保结果集不可以重复取值。

并且可以看到:

sum == target ;加入结果集,返回

sum >target :不加入结果集,直接返回

sum<target :继续递归

所以这三个条件应写在同一层级 if -else语句中,即对结果的判断,而不是这种剪枝代码:

for (int i = startIndex; i <= 9-(k-path.size())+1; i++) {sum+=i;path.add(i);if(sum>n){sum-=i;path.remove(path.size()-1);return;}getPath(n,k,i+1);sum-=i;path.remove(path.size()-1);}

示意图: 

 

代码

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

 40.组合总和II

题目链接/文章讲解:代码随想录

视频讲解:回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II_哔哩哔哩_bilibili

第一想法:

输入: candidates = [2,5,2,1,2], target = 5, 这个示例画图后会发现得到[2,2,1]和[ 2,1,2]两个结果,判定为同一结果,应当去重。结果集用set去重

代码随想录:

关于去重的理解:

这里卡哥讲的真的很深入。搜索的过程中去掉重复组合。所谓去重,就是使用过的元素不能重复选取。

组合问题可以抽象为树形结构,那么使用过在这个树形结构上具有两个维度。即树层和数值。

同一树枝上都是一个组合里的元素,不用去重。

树层去重需要排序,要使两个相同元素紧挨在一起方便去重。

不可以重复选取1是因为:第一个1已经包含了所有以1能满足结果的情况,如果再以第二个1开始构造结果,势必会造成重复。
假设数组[1,1,2,3,5,6] target = 8,以第一个1构造可以得到[1,1,6],[1,2,5]....以第二个1构造会得到[1,2,5],这就会造成重复。

如何横向去重:

那么如何横向去重呢:数组需要排序,i>startIndex && digits[i]==digits[i-1] continue;

我提一下我个人的理解,假如在for循环中的if语句不用卡哥所说的i >0而是用i>index,这样就可以不用uesd数组了。因为如果i>index&&candidates【i】==candidates【i-1】,这样可以保证在每次backtracking中相邻元素相同值的 for循环的第二次被去重,而再次使用backtracking的时候带入的是新的index+1参数,这样就可以在不使用uesd数组的情况下,避免出现【1,1,1,2】要和为3时子集【1,1,1】被忽略的问题。

代码:
 

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

131.分割回文串

代码随想录

视频讲解:带你学透回溯算法-分割回文串(对应力扣题目:131.分割回文串)| 回溯法精讲!_哔哩哔哩_bilibili

代码随想录

需要自己一边写代码一遍画图才能体会到。

代码

class Solution {List<List<String>> result = new ArrayList<>();List<String> itemPath = new ArrayList<>();public List<List<String>> partition(String s) {getPath(s,0);return result;}public void getPath(String s,int startIndex){if(startIndex>=s.length()){result.add(new ArrayList<>(itemPath));return;}for(int i = startIndex;i<s.length();i++){//截取一个字符串 subString 左闭右开,"aab".subString(0,3) = "aab";String subString = s.substring(startIndex,i+1);if(isPalindrome(subString)){itemPath.add(subString);//如果是回文串,则加入}else{continue;}getPath(s,i+1);itemPath.remove(itemPath.size()-1);}}public boolean isPalindrome(String s){for(int i = 0,j=s.length()-1;i<j;i++,j--){if(s.charAt(i)!=s.charAt(j)){return false;}}return true;}
}

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

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

相关文章

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

2024电赛H题参考方案——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 其他模块根据需要移植 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&…

Vue3响应式高阶用法之toRaw()

Vue3响应式高阶用法之toRaw() 文章目录 Vue3响应式高阶用法之toRaw()一、简介二、使用场景2.1 性能优化2.2 与外部库的集成 三、基本使用3.1 创建响应式对象3.2 获取原始对象3.3 修改原始对象 四、功能详解4.1 toRaw的工作原理4.2 使用注意事项 五、最佳实践及案例5.1 性能优化…

基于深度学习的智能手势识别系统

基于深度学习的石头剪刀布手势识别&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 石头剪刀布是一种简单而有趣的游戏。通过基于深度学习的手势识别系统&#xff0c;我们可以自动检测和识别玩家的手势。本文将详细介绍如何构建一个石头剪刀布手势识别系统…

C++类与对象-总结实践篇

为了总结熟悉类与对象相关的语法&#xff0c;本文通过实现经典的日期计算来练习巩固这一块的知识 目录 一、要实现的功能 二、难点分析 2.1 判断日期大小 2.2 日期加/减对应天数 2.3 两个日期相减 三、源代码 牛客网日期类相关练习题&#xff1a; 日期累加_牛客题霸_牛…

Oracle 19c打Datapatch数据补丁报错处理

Oracle 19c打Datapatch数据补丁报错处理 错误分析重新编译补丁验证安装完数据库补丁后,在数据补丁的步骤收到以下报错: Connecting to database...OK Gathering database info...done Bootstrapping registry and package to current versions...done Determining current s…

【Java】韩顺平Java学习笔记 第19章 IO流

文章目录 文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter 节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream & BufferedOutputStream 对象流&#…

LeetCode 算法:搜索插入位置 c++

原题链接&#x1f517;&#xff1a;搜索插入位置 难度&#xff1a;简单⭐️ 题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(l…

Python | TypeError: ‘module’ object is not callable

Python | TypeError: ‘module’ object is not callable 在Python编程中&#xff0c;遇到“TypeError: ‘module’ object is not callable”这类错误通常表明你尝试像函数一样调用了一个模块。这种错误通常是由于导入模块时的疏忽或误解导致的。本文将深入探讨此错误的根源&…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…

vivado LOC

LOC LOC指定逻辑单元对目标SITE资源的放置分配 Xilinx部分。 LOC属性或约束有时与BEL属性一起使用&#xff0c;以定义精确的 将细胞放置在设备内。在这些情况下&#xff0c;必须定义BEL约束 否则将发生放置错误。 提示&#xff1a;要将I/O端口分配给设备包上的物理引脚&#xf…

大语言模型系列——Transformer 介绍与使用

引言 自从 Google 在 2017 年发表了一篇题为《Attention Is All You Need》的论文以来&#xff0c;Transformer 已经成为了自然语言处理领域的一个重要里程碑。与传统的 RNN 和 LSTM 不同&#xff0c;Transformer 通过自注意力机制&#xff08;Self-Attention Mechanism&#…

使用eclipse在新建的java项目中编辑xml文件时Unhandled event loop exception No more handles

处理方法&#xff1a;更换xml编辑器 Window ——》Preferences ——》General ——》Editors ——》File Associations 如果File types里面没有*.xml&#xff0c;则点击Add进行新增 选中*.xml&#xff0c;然后在Associated editors 选中想用的编辑器&#xff0c;设置为defaul…

Selenium---Xpath选择器

XPath (XML Path Language) 是由国际标准化组织W3C指定的&#xff0c;用来在 XML 和 HTML 文档中选择节点的语言。 xpath 语法中&#xff0c;整个HTML文档根节点用/表示&#xff0c;如果我们想选择的是根节点下面的html节点&#xff0c;则可以在搜索框输入 /html如果输入下面…

vpp中的不同节点的数据传输,使用vpp中的回调函数,相同的原理也可以实现,不同节点的函数的调用

vpp中的不同节点的数据传输&#xff0c;使用vpp中的回调函数&#xff0c;相同的原理也可以实现&#xff0c;不同节点的函数的调用 1.实现数据传输所需要用到的函数2.具体实现 1.实现数据传输所需要用到的函数 需要用到的一个宏__clib_export 作用&#xff1a;就是将这后边的…

小白也能读懂的ConvLSTM!(开源pytorch代码)

ConvLSTM 1. 算法简介与应用场景2. 算法原理2.1 LSTM基础2.2 ConvLSTM原理2.2.1 ConvLSTM的结构2.2.2 卷积操作的优点 2.3 LSTM与ConvLSTM的对比分析2.4 ConvLSTM的应用 3. PyTorch代码参考文献 仅需要网络源码的可以直接跳到末尾即可 1. 算法简介与应用场景 ConvLSTM&#x…

app-routing.module.ts 简单介绍

Angular的路由是一种功能&#xff0c;它允许应用程序响应不同的URL路径或参数并根据这些路径加载不同的组件。app-routing.module.ts是Angular项目中负责设置应用程序路由的文件。 以下是一个简单的app-routing.module.ts文件示例&#xff0c;它配置了三个路由&#xff1a; i…

SAPUI5基础知识22 - 图标(Icons)

1. 背景 SAPUI5 提供了一套丰富的图标库&#xff0c;可以用于增强应用程序的视觉吸引力和用户体验。这些图标是矢量图形&#xff0c;可以在任何分辨率下保持清晰&#xff0c;并且可以自定义颜色和大小。 2. 示例 在 SAPUI5 中&#xff0c;图标可以通过 sap.ui.core.Icon 控件…

Redis快速入门基础

Redis入门 Redis是一个基于内存的 key-value 结构数据库。mysql是二维表的接口数据库 优点&#xff1a; 基于内存存储&#xff0c;读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ Redis下载与…

Spring缓存注解

Spring缓存注解 EnableCaching | 来启动缓存注解Cached | 用来表示某一个方法的结果可以被缓存 Cached(name “testCache:id1:”, key “#testId”, cacheType CacheType.REMOTE, localLimit CustomerConstants.DEFAULT_LIMIT, expire 1800)方法方法上。 #相关参数&#…