首页 > 编程语言 >代码随想录算法训练营第二十三天| leetcode39. 组合总和、leetcode40.组合总和II、leetcode131.分割回文串

代码随想录算法训练营第二十三天| leetcode39. 组合总和、leetcode40.组合总和II、leetcode131.分割回文串

时间:2024-11-12 22:31:09浏览次数:1  
标签:target 组合 self 随想录 candidates result path def 总和

1 leetcode39. 组合总和

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

文章链接:代码随想录

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

思路:跟之前差不多,就是将他的循环改一下,但是我发现有重复的数值了,不知道如何删除

1.1 自己的思路

错误

  1. 基本思路是完全可以实现的,但是有重复的数值,不知道怎么删除,但是也就浅浅记录一下这个方法吧
class Solution:
    def __init__(self):
        self.result =[]
        self.path = []
        self.num = 0
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        self.backtracking(candidates,target)
        return self.result
    def backtracking(self,candidates,target):
        if sum(self.path[:])>target:
            return
        if sum(self.path[:])==target:
            self.result.append(self.path[:])
            return self.result
        for i in range(len(candidates)):
            self.path.append(candidates[i])
            self.backtracking(candidates,target)
            self.path.pop()

1.2 视频的思路

看视频过程中然后反思自己的代码,做出来了

原因:索引的起始位置出现了错误,更改以后就正确了

class Solution:
    def __init__(self):
        self.result =[]
        self.path = []
        self.num = 0
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        self.backtracking(candidates,target,0)
        return self.result
    def backtracking(self,candidates,target,index):
        if sum(self.path[:])>target:
            return
        if sum(self.path[:])==target:
            self.result.append(self.path[:])
            return self.result
        for i in range(index,len(candidates)):
            self.path.append(candidates[i])
            self.backtracking(candidates,target,i)
            self.path.pop()

1.3 剪枝的方法

class Solution:
    def __init__(self):
        self.result =[]
        self.path = []
        self.num = 0
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        self.backtracking(candidates,target,0)
        return self.result
    def backtracking(self,candidates,target,index):
        candidates.sort()
        if sum(self.path[:])>target:
            return
        if sum(self.path[:])==target:
            self.result.append(self.path[:])
            return self.result
        for i in range(index,len(candidates)):
            if target-candidates[i]<0:
                break
            self.path.append(candidates[i])
            self.backtracking(candidates,target,i)
            self.path.pop()

1.4 本题小结

  1. 这道题我也算是真正自己做啦,就是当时忘记去重,不知道怎么加后来自己想了以后也写出来啦
  2. 这道题的剪枝方法,我感觉排序会浪费时间,觉得没有优化太多

2 leetcode40.组合总和II

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

文章链接:代码随想录

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

思路:照葫芦画瓢,结果发现我翻车了,就是有重复的

2.1 回溯的方法

这里的判断条件挺有意思的,从当前位置的后一个去比较,比较他们的值是否有重复的,然后进行去重,确实这个去重是我没有想到的地方

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        self.backtracking(candidates,target,0)
        return self.result
    def backtracking(self,candidates,target,startindex):
        if sum(self.path[:])>target:
            return
        if sum(self.path[:])==target:
            self.result.append(self.path[:])
            return self.result
        for i in range(startindex,len(candidates)):
            if i>startindex and candidates[i]==candidates[i-1]:
                continue
            self.path.append(candidates[i])
            self.backtracking(candidates,target,i+1)
            self.path.pop()

2.2 使用一个列表的去重方法

这种方法,确实还是自己的资历不够很多时候知道要干啥,但是我确实也写不出来

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        used = [False]*len(candidates)
        self.backtracking(candidates,target,0,used)
        return self.result
    def backtracking(self,candidates,target,startindex,used):
        if sum(self.path[:])>target:
            return
        if sum(self.path[:])==target:
            self.result.append(self.path[:])
            return self.result
        for i in range(startindex,len(candidates)):
            if i>0 and candidates[i]==candidates[i-1] and used[i-1]==False:
                continue
            self.path.append(candidates[i])
            used[i] =True
            self.backtracking(candidates,target,i+1,used)
            self.path.pop()
            used[i] =False

2.3 本题小结

  1. 这道题的关键点在于去重,对于python去重其实可以保证这个数比当前位置的值大,且与这个数值相等就好了
  2. 这种used的去重方法,相对而言更适用于所有方法吧

3 leetcode131.分割回文串

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

文章链接:代码随想录

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

思路:嗯,就是看不懂吧,,

3.1 视频后的思路

晚上看视频有点晕的感觉,就看讲解做了,嗯,觉得自己好懒多定义一个函数都不想,哈哈哈哈哈哈哈,其实定义一个新的函数就可以对其进行一个使用了

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    
    def partition(self, s: str) -> List[List[str]]:
        self.backtracking(s,0)
        return self.result

    def backtracking(self,s,startindex):
        if startindex==len(s):
            self.result.append(self.path[:])
            return
        for i in range(startindex,len(s)):
            if self.isPalindrom(s,startindex,i):
                self.path.append(s[startindex:i+1])
                self.backtracking(s,i+1)
                self.path.pop()

    def isPalindrom(self,s,left,right):
        while left<right:
            if s[left]!=s[right]:
                return False
            left +=1
            right-=1
        return True          

3.2 本题小结

  1. 这道题,成功被自己的思维打败了,居然就是多定义一个函数并且在结尾处再对数据进行处理就好了
  2. 晚上了,不知道写啥,但是觉得真的不难

4 今日小结

  1. 第一道题是对之前题目的一个再回顾吧,我觉得剪枝没有太多的优化
  2. 第二题当时困住我的地方是不知道如何去重,后来发现其实在python中去重的方法挺多的
  3. 第三题,主要是真的不知道如何分割之类的问题,不过后来好好去思考了,跟着题目也算是可以做了吧

标签:target,组合,self,随想录,candidates,result,path,def,总和
From: https://www.cnblogs.com/csfy0524/p/18542797

相关文章

  • 多组数据组合输出成表格
    需求如下:有一组变量,数量不确定,变量的取值是1-n个,组合每个变量的各种取值得到图2的结果并保存为文件。 (图1) (图2)直接上代码:一、先定义要导出的数据结构namespaceTestAppendCellData{publicclassExportDataDriverTemplateData{///<summary>......
  • 代码随想录算法训练营第十一天|LeetCode150.逆波兰表达式求值、239.滑动窗口最大值、3
    前言打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目在学......
  • 组合数学学习笔记
    更好的阅读体验update2024-11-1211:25修改了一些格式错误且增加了二项式反演的例题2024-11-1214:33改进了二项式反演的证明基础知识一、加法原理完成某个工作有\(n\)类办法,第\(i\)类办法有\(a_i\)种,则完成此工作的方案数有\(\sum\limits_{i=1}^na_i\)种。二......
  • 代码随想录 -- 动态规划 -- 完全背包理论基础
    52.携带研究材料(第七期模拟笔试)思路:dp[j]的含义:装满容量为j的背包时,背包的最大价值为dp[j].递推公式:当j>=weight[i]时:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])初始化:全部初始化为0遍历顺序:先遍历物品和先遍历背包都可以,都是从前往后遍历(因为物品可以重复使用)。n,......
  • 全球粉丝疯狂狂欢,世界顶级流行偶像组合发布新专辑
     今天,全球粉丝们疯狂狂欢!世界知名的流行偶像组合“SparkleStars”宣布他们即将发布他们最新的专辑《Unstoppable》!这支组合在音乐界拥有数百万忠实粉丝,他们的歌曲总是能在音乐榜单上获得高位,并创下了众多销售记录。 据悉,这张新专辑将包含十首全新歌曲,每一首歌曲都经过了......
  • 组合
    二项式反演\[f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrowg(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\]其中\(f\)为恰好,\(g\)为至多。(可以用于随便选)\[f(n)=\sum_{i=n}^m\binom{i}{n}g(i)\Leftrightarrowg(n)=\sum_{i=n}^m(-1)^{i-n}\binom{i}{n}f(......
  • 代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数
    资源引用:leetcode题目:344.反转字符串(344.反转字符串-力扣(LeetCode))541.反转字符串Ⅱ(541.反转字符串II-力扣(LeetCode))卡玛网题目:卡玛网54.替换数字(54.替换数字(第八期模拟笔试)(kamacoder.com))碎碎念回归:本来应该11月6号打卡的,因为接连4天的考试+多个竞赛,导致推迟......
  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • 代码随想录算法训练营第二十二天| leetcode77. 组合、leetcode216.组合总和III、leetc
    1leetcode77.组合题目链接:77.组合-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多1.1回溯三部曲回溯的方法首......