代码随想录第25天 | 回溯算法part2

文章讲述了使用递归回溯法(backTrack)解决两道编程题:一是找到所有可能的3个整数组合,使其和为给定的数;二是给定一个数字,返回所有可能的字母组合。在第一个问题中讨论了维护sum值对优化的影响,而在第二个问题中展示了如何根据数字映射到字母来生成电话号码的字母组合。
摘要由CSDN通过智能技术生成

216 组合总和|||

和昨天的题思路一致

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        self.record = []
        self.temp = []
        self.backTrack(k,n,1)
        return self.record


    def backTrack(self,k,n,startIndex):
        if sum(self.temp) == n and len(self.temp) == k:
            self.record.append(self.temp.copy())
        for i in range(startIndex,10):
            self.temp.append(i)
            self.backTrack(k,n,i+1)
            self.temp.pop()

看了一下解答,我并没有维护sum,直接在判断中,而且比没有设置返回,为什么可以返回呢?
这里for循环执行完毕会自动返回的,没有return也会返回,但是在if下面添加返回条件可以剪枝,避免无效的迭代,测试了一下确实如此
那么不维护sum有影响吗?维护一个sum可以减少求和的运算,降低计算复杂度

17 电话号码的字母组合

用上一题的思路写了一半发现好像迭代法更直接一些?写个字典,不对,这样还是无法确定迭代层数。。

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits) == 0: return []
        self.temp = []
        self.record = []
        self.nums = [int(x) for x in digits]
        self.nums.append(1)
        self.dict = {2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
        self.backTrack(0)
        return self.record

    def backTrack(self,startIndex):
        if self.nums[startIndex] == 1:
            self.record.append(''.join(self.temp))
            return
        for i in self.dict.get(self.nums[startIndex]):
            self.temp.append(i)
            self.backTrack(startIndex+1)
            self.temp.pop()

遍历的不是数字,因为顺序实际上是确定不变的,遍历的是每个数字对应的字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值