LeetCode 第二十三天 2024.8.9

1. :组合总和
 题目链接: 39. 组合总和 - 力扣(LeetCode)
应用条件:回溯,递归

难点:

这道题相比之前简单的组合问题,难点在于可以重复选择,重复选择也是需要startindex的,因为如果没有startindex在递归中将会一直在第一个陷入死循环。只不过这次在for循环中的递归中把startindex从原来的i+1变成i即可包含重复选择了。

个人错误:

没记startindex,一开始忽略了sum(curlist) >  target

思路:

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        curlist  = []
        res = []
        startindex = 0
        self.backtracking(candidates,target,curlist,res,startindex)
        return res


    def backtracking(self,nums,target,curlist,res,startindex):
        if sum(curlist) >  target:
            return
        if sum(curlist) == target:
            res.append(curlist[:])
            return
        for i in range(startindex,len(nums)):
            curlist.append(nums[i])
            self.backtracking(nums,target,curlist,res,i)
            curlist.pop()

2. :组合总和II
 题目链接: 40. 组合总和 II - 力扣(LeetCode)
应用条件:回溯

难点:

这道题最难的点在于数组中有重复元素,但在res中不让有重复的答案,所以我们需要在递归过程中对结果集元素去重。curlist相当于书的枝,for循环想到与树的层,这里要明确我们要对层去重,枝中是可以包含重复元素的。所以可以先对数组进行排列,然后在对i的for循环中,判断在i>startindex的情况下nums[i] == nums[i-1]的情况,如果满足条件就continue,注意在这里,一定是i>startindex,不能i>0,因为如果i> 0就把枝中的也去掉了。

个人错误:

思路:

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        curist = []
        res = []
        startindex = 0
        candidates.sort()
        self.backtracking(candidates,target,curist,res,startindex)
        return res


    def backtracking(self,nums,target,curist,res,startindex):
        if sum(curist) > target:
            return
        if sum(curist) == target:
            res.append(curist[:])
            return
        for i in range(startindex,len(nums)):
            if i >startindex and nums[i] == nums[i-1]:
                continue
            curist.append(nums[i])
            
            self.backtracking(nums,target,curist,res,i+1)
            curist.pop()

3. :分割回文串
 题目链接: 131. 分割回文串 - 力扣(LeetCode)
应用条件:回溯

难点:

这道题的难点在于能否想到递归终止条件是startindex == len(s),

个人错误:

思路:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        curlist = []
        startindex = 0
        self.backtracking(s,curlist,res,startindex)
        return res

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值