代码随想录算法训练营第23天 | 39.组合总和 40.组合总和Ⅱ 131.分割回文串

news/2024/10/5 7:44:54/文章来源:https://www.cnblogs.com/MengyiSun/p/18274504

39.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。

解题

本题和我们之前讲过的77.组合、216.组合总和III有两点不同:
1.组合没有数量要求
2.元素可无限重复选取

报错:1.递归时不用i+1,因为可以重复取;2.回溯忘记处理sum了;
不想看剪枝。。
一个集合里找组合的都要startIndex的哈~

点击查看代码
class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:result=[]self.backtracking(candidates,target,0,0,[],result)return resultdef backtracking(self,candidates,target,sum,startIndex,path,result):if sum>target:returnif sum==target:result.append(path[:])returnfor i in range(startIndex,len(candidates)):path.append(candidates[i])sum+=candidates[i]self.backtracking(candidates,target,sum,i,path,result)path.pop()sum-=candidates[i]

40.组合总和Ⅱ

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。

解题

这道题目和39.组合总和 (opens new window)如下区别:
1.本题candidates 中的每个数字在每个组合中只能使用一次。
2.本题数组candidates的元素是有重复的,而39.组合总和是无重复元素的数组candidates
去重:搜索过程中把同一树层使用过的元素去重,需要对数组排序!!

参数:增加一个bool型参数used
在candidates[i] == candidates[i - 1]相同的情况下:
1.used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
2.used[i - 1] == false,说明同一树层candidates[i - 1]使用过,需要去重这部分!continue跳跳跳过!
if i > startIndex and candidates[i] == candidates[i - 1] and not used[i - 1]:continue
当以上三个条件都满足时,执行 continue 语句,跳过当前循环的剩余部分,直接进入下一次循环。

点击查看代码
class Solution:def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:used=[False]*len(candidates)result=[]candidates.sort()self.backtracking(candidates,target,0,0,used,[],result)return resultdef backtracking(self,candidates,target,sum,startIndex,used,path,result):if sum>target:returnif sum==target:result.append(path[:])returnfor i in range(startIndex,len(candidates)):if i>startIndex and candidates[i]==candidates[i-1]and not used[i-1]:continuesum+=candidates[i]path.append(candidates[i])used[i]=Trueself.backtracking(candidates,target,sum,i+1,used,path,result)used[i]=Falsepath.pop()sum-=candidates[i]

131.分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是
回文串。返回 s 所有可能的分割方案。

解题

分割线就是startIndex,它也表示递归到哪一层,表示接下来处理的序列是从哪个开始
终止:分割线在最后,startIndex=len(s)
单层递归逻辑:多了个判断s[start_index: i + 1]是否是回文串
if s[start_index: i + 1] == s[start_index: i + 1][::-1]:

点击查看代码
class Solution:def partition(self, s: str) -> List[List[str]]:result=[]self.backtracking(s,0,[],result)return resultdef backtracking(self,s,startIndex,path,result):if startIndex==len(s):result.append(path[:])returnfor i in range(startIndex,len(s)):if s[startIndex:i+1]==s[startIndex:i+1][::-1]:path.append(s[startIndex:i+1])self.backtracking(s,i+1,path,result)path.pop()

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

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

相关文章

北航软院人工智能课程笔记

北航软院人工智能课程笔记,期末复习用。你软绝世好课,实际上照搬浙大吴飞老师(慕课)&台大李宏毅老师(B站or油管)的PPT…… 上课听不进去可以直接去听这两位老师的课。 期末复习自用笔记,有误欢迎指正。绪论机器学习及有监督学习 机器学习基本概念 机器学习:就是从数…

PTA题目集7-8总结

1. 前言知识点: 继承,多态,类设计 题量:一次一道题,1000行代码左右,还行,不多 难度:家居强电电路模拟程序-3 :略难,主要是互斥开关好难设计啊!!!不知道要怎么写 家居强电电路模拟程序-4 :太难啦,提示和没有一样啊!!!真的找不到还有哪里错啦,想不到啊啊啊!!…

LLM并行训练3-数据并行

大模型训练 数据并行相关的学习笔记, 主要内容 zero, zero++前置知识 混合精度训练在参数存储时采取fp32, 开始进行fp/bp时转成fp16运算, 拿到fp16梯度后再转回fp32更新参数. ZeRO对显存占用的估算:模型状态: Weights(fp16)、grad(fp16) 和 MasterWeights(fp32 模型参数备份),…

货车运输的五种解法

上完课整的活(这里的“五种解法”之间有实现方式之外的不同) 方法1:最大生成树 + 树上倍增 本题的标准解法,先用 kruskal 建出最大生成树,再在最大生成树跑树上倍增求路径 \(min\) ,时间复杂度为 \(\Theta(n \log n + q \log n)\)。 树上倍增也可以用树剖替换,但是需要两…

一张图让你看懂10种软件架构风格

软件架构风格是构建各种软件系统的基本蓝图,确保它们满足特定的要求和质量属性。通过坚持合适的架构风格,组织可以确保其软件系统的构建与其战略目标保持一致,适应未来的变化,并在面对不断发展的技术环境和用户需求时具有弹性。 以下是最常见的样式:(单体架构):将整个…

linux三剑客-grep、sed、awk

Linux三剑客是Linux系统中最重要的三个命令,它们以其强大的功能和广泛的应用场景而闻名。这三个工具的组合使用几乎可以完美应对Shell中的数据分析场景,因此被统称为Linux三剑客。 1、grep grep是一个强大的文本搜索工具,用于在文件内容中查找指定的字符串,并将匹配到的行输…

联通网络无法使用FTP,无法使用21端口连接的解决方法

最近家里换了联通的网络,结果发现连接不上FTP了,本来以为是软件的问题。最后发现只有21端口的FTP连接不上,其它的端口没问题。 首先想到的是肯定是联通的光猫把21端口给关闭了。然后就想着通过192.168.1.1来设置一下光猫。专业网站制作、系统开发订制、微信公众号开发、接外…

LINUX命令-sed

sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,熟练运用可提高shell脚本编写能力和在terminal下的工作效率。本文编辑小绝技-sed sed命令是用于对文本文件做内容操作的神器,常见的增删改都可以,查没必要用它,用grep或者gvim打开用vim的搜索匹配就行。 sed …

毕业好几年了还要考研吗?

其实,毕业多少年都不影响我们考研,因为考研本身并没有年限或者年龄上的限制。所以,在是否考研这个问题上,我们真正应该思考的是,我们是否已经对未来做了一个比较合理的规划,考研这件事是否在未来的规划中有着重要的影响,如果是,而且现实条件也允许我们去考,那么,就应…

ubuntu 下使用netplan配置网络

一个yaml走遍天下。 netplan 是Ubuntu底层网络配置的封装,它允许使用yaml的方式“声明式”的配置底层网络,不管底层网络是NetworkManager还是networkd. netplan 官网,使用静态配置的示例: https://netplan.readthedocs.io/en/stable/netplan-tutorial/#using-static-ip-add…

(并查集+双向映射)

题意: 思路: 题目就是让我们实现把一个代表数x的集合加到另一个代表数y的集合中多次操作,这个很容易想到用并查集维护,将相同数字的下标放到一个集合中,集合所代表的数字,用“集合的首领”和代表的数字做一个双射,这样既能表示出集合所带表的数,还能辅助之后输出集合,…