代码随想录算法训练营第二十二天 | 77. 组合、216.组合总和III、17.电话号码的字母组合

想起来11月被华为机试干掉的那一天...子集划分题考场上已经想到回溯+DP但是回溯写不起来饮恨当场...

这次刷完去把几题回溯+DP的题过一遍...

加深印象!!!

77. 组合

回溯模板题

注意剪枝逻辑。

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []

        def dfs(i, path):
            if len(path) == k:
                res.append(path[:])
                return
            for j in range(i, n + 1 - k + len(path) + 1):
                path.append(j)
                dfs(j + 1, path)
                path.pop()
        dfs(1, [])
        return res

216.组合总和III

注意剪枝逻辑。

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        if n < k * (k - 1) // 2 or n > k * (19 - k) // 2:
            return []

        res = []
        path = []
        def dfs(start, target):
            if target < 0:
                return
            if len(path) == k and target == 0:
                res.append(path.copy())
                return
            for i in range(start, 10 - k + len(path)):
                path.append(i + 1)
                dfs(i + 1, target - i - 1)
                path.pop()

        dfs(0, n)

        return res

17.电话号码的字母组合 

递归回溯就是探查-撤销每个电话号码;

for循环就是遍历每个电话号码的字母。

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        dial = {
            '2': 'abc', 
            '3': 'def', 
            '4': 'ghi',
            '5': 'jkl', 
            '6': 'mno', 
            '7': 'pqrs', 
            '8': 'tuv', 
            '9': 'wxyz'
        }

        l = len(digits)
        res = []

        def dfs(path, i):
            if len(path) == l:
                res.append(path)
                return
            for j in range(len(dial[digits[i]])):
                dfs(path + dial[digits[i]][j], i + 1)

        if digits:
            dfs('', 0)
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值