代码随想录day24 回溯(1)

77. 组合 - 力扣(LeetCode) 

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

    def backtrace(self, n, k, start):
        if len(self.path) == k:
            cur = tuple(self.path)
            self.res.append(list(cur))
            return 
        if start + k - len(self.path) <= n + 1: #剪枝
            for num in range(start, n+1):
                self.path.append(num)
                self.backtrace(n, k, num+1)
                self.path.pop()

    def combine(self, n: int, k: int) -> List[List[int]]:
        self.backtrace(n, k, 1)
        return self.res

 

216. 组合总和 III - 力扣(LeetCode) 

self.path和n是对应的,n为target减去path中所有元素;而start是path和n的下一层,表示紧接着path末尾元素的下一个元素。

class Solution:
    def __init__(self):
        self.path = []
        self.res = []
    
    def backtrace(self, k, n, start):
        if len(self.path) == k:
            if n == 0:
                self.res.append(self.path[:])
                return

        if start + k - len(self.path) <= 10: #剪枝1
            for num in range(start, 10):
                if num <= n: #剪枝2
                    self.path.append(num)
                    self.backtrace(k, n-num, num+1)
                    self.path.pop()
             

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

 

17. 电话号码的字母组合 - 力扣(LeetCode) 

class Solution:
    def __init__(self):
        self.path = []
        self.res = []
        self.num2let = self.getmap()
    
    def getmap(self):
        num2let = {}
        for i in range(2, 7):
            num2let[str(i)] = [chr(ord('a')+j) for j in range(3*(i-2), 3*(i-2)+3)]
        num2let['7'] = ['p', 'q', 'r', 's']
        num2let['8'] = ['t', 'u', 'v']
        num2let['9'] = ['w', 'x', 'y', 'z']
        return num2let

    def backtrace(self, digits, num_id):
        if len(digits) == len(self.path):
            self.res.append("".join(self.path))
            return

        letters = self.num2let[digits[num_id]]
        for ind in range(len(letters)):
            self.path.append(letters[ind])
            self.backtrace(digits, num_id+1)
            self.path.pop()

    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []
            
        self.backtrace(digits, 0)
        return self.res

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值