Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25

216. Combination Sum III

回溯

class Solution:
    def __init__(self):
        self.path = []
        self.res = []

    def backtracking(self, targetSum, curSum, count, startIndex):
        # 终止条件
        if len(self.path) == count:
            if curSum == targetSum:
                self.res.append(self.path.copy())
            return

        for i in range(startIndex, 10):
            self.path.append(i)
            curSum += i
            self.backtracking(targetSum, curSum, count, i+1)    # 递归
            curSum -= i         # 回溯
            self.path.pop()

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        self.backtracking(n, 0, k, 1)
        return self.res

回溯,剪枝优化

已选元素总和如果已经大于targetSum了,那么往后遍历就没有意义了,直接剪掉。

class Solution:
    def __init__(self):
        self.path = []
        self.res = []

    def backtracking(self, targetSum, curSum, count, startIndex):
        # 终止条件
        if len(self.path) == count:
            if curSum == targetSum:
                self.res.append(self.path.copy())
            return

        for i in range(startIndex, 10):
            self.path.append(i)
            curSum += i

            if curSum > targetSum:  # 剪枝
                curSum -= i         # 剪枝之前先把回溯做了
                self.path.pop()
                return

            self.backtracking(targetSum, curSum, count, i+1)    # 递归
            curSum -= i         # 回溯
            self.path.pop()

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        self.backtracking(n, 0, k, 1)
        return self.res

17. Letter Combinations of a Phone Number

这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。

class Solution:
    def __init__(self):
        self.letterMap = [
            '',
            '',
            'abc',
            'def',
            'ghi',
            'jkl',
            'mno',
            'pqrs',
            'tuv',
            'wxyz'
        ]
        self.string = []
        self.res = []

    def backtracking(self, digits, index):
        # 终止条件
        if index == len(digits):
            self.res.append(''.join(self.string.copy()))
            return

        digit = int(digits[index])
        for i in range(len(self.letterMap[digit])):
            self.string.append(self.letterMap[digit][i])
            self.backtracking(digits, index + 1)
            self.string.pop()   # 回溯

    def letterCombinations(self, digits: str) -> List[str]:
        if digits == "": return []
        self.backtracking(digits, 0)
        return self.res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值