算法训练营

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

39. 组合总和

题目链接: 39. 组合总和
文档讲解: 代码随想录
题目难度:中等

思路:递归法
时间复杂度:O(n*2^n);空间复杂度:O(n)
下面展示 代码

class Solution:
    def __init__(self) -> None:
        self.res = []
    def backtracking(self, candidates, target, start, sum,s):
        if sum == target:
            self.res.append(s[:])
            return
        if sum > target:
            return
        for i in range(start, len(candidates)):
            # 剪枝版
            if sum + candidates[i] > target:
                continue
            sum += candidates[i]
            s.append(candidates[i])
            if sum > target:
                continue
            else:
                self.backtracking(candidates, target, i, sum,s)
                sum -= candidates[i]
                s.pop()
                
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        s = []
        sum = 0
        # 剪枝版
        candidates.sort()
        self.backtracking(candidates, target, 0, sum, s)
        return self.res

40.组合总和II

题目链接: 40.组合总和II
文档讲解: 代码随想录
题目难度:中等
思路: 同上一题类似,区别在于不能重复使用数组元素,因此需要判断相同元素不在同一树层
时间复杂度:O(n*2^n);空间复杂度:O(n)
代码如下

class Solution:
    def __init__(self) -> None:
        self.res = []
    def backtracking(self, candidates, target, start, sum,s):
        if sum == target:
            self.res.append(s[:])
            return
        for i in range(start, len(candidates)):
            if sum + candidates[i] > target:
                break
            if i > start and candidates[i] == candidates[i - 1]:  # 此处加上i > start条件,表示是同一树层
                continue
            else:
                sum += candidates[i]
                s.append(candidates[i])
                self.backtracking(candidates, target, i + 1, sum,s)  # 不使用重复的字符,即为i+1
                sum -= candidates[i]
                s.pop()
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        s = []
        sum = 0
        # 剪枝版
        candidates.sort()
        self.backtracking(candidates, target, 0, sum, s)
        return self.res

131.分割回文串

题目链接: 131.分割回文串
文档讲解: 代码随想录
题目难度:中等
思路: 需要加一个判断回文串函数,利用双指针即可解决
时间复杂度:O(n*2n);空间复杂度:O(n2)
代码如下

class Solution:
    def ispalindrome(self, s, left, right):
        i,j = left, right
        while i < j:
            if s[i] != s[j]:
                return False
            i += 1
            j -= 1
        return True
    def backtracking(self, s, start, path, res):
        if start == len(s):
            res.append(path[:])
            return
        for i in range(start, len(s)):
            if self.ispalindrome(s, start, i):
                path.append(s[start:i + 1])
                self.backtracking(s, i + 1, path, res)
                path.pop()
    def partition(self, s: str) -> List[List[str]]:
        if len(s) == 1:
            return [[s]]
        else:
            res = []
            self.backtracking(s, 0, [], res)
            return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值