LeetCode算法刷题(python) Day28|07回溯算法|216.组合总和III、17.电话号码的字母组合

本文介绍了LeetCode中的两个问题,分别是使用回溯算法解决的216号问题组合总和III,通过剪枝优化搜索过程,以及17号问题电话号码的字母组合,展示了如何通过递归和追踪状态实现解法。
摘要由CSDN通过智能技术生成

LeetCode 216.组合总和III

力扣题目链接
回溯算法,本题可以进行剪枝操作,若当前和已经超过了目标和,就没有必要继续遍历下去了,因为后面的一定也会超过目标和,那么这些就可以剪枝掉。

class Solution:
    def __init__(self):
        self.result = []
        self.track = []
        self.cur_sum = 0
        
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        self.backtrack(k, n, 1)
        return self.result
    
    def backtrack(self, k, n, start):
        if len(self.track) == k:
            if self.cur_sum == n:
                self.result.append(self.track[:])
                return
            else:
                return
        
        for i in range(start, 10):
            if self.cur_sum + i <= n: # 剪枝
                self.cur_sum += i
                self.track.append(i)
                self.backtrack(k, n, i + 1)
                self.track.pop()
                self.cur_sum -= i

LeetCode 17.电话号码的字母组合

力扣题目链接
回溯算法,回溯函数需要输入一个index,指定当前循环遍历哪个数字代表的字母

class Solution:
    def __init__(self):
        self.strings = [
            "",
            "",
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz"
        ]
        self.result = []
        self.track = ""
        
    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits) == 0:
            return []
        self.backtrack(digits, 0)
        return self.result
        
    def backtrack(self, digits, index):
        if len(self.track) == len(digits):
            self.result.append(self.track[:])
            return
        s = self.strings[int(digits[index])]
        for i in range(len(s)):
            self.track += s[i]
            self.backtrack(digits, index + 1)
            self.track = self.track[:-1]         

今日毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值