【代码随想录算法训练营】第25天 | 第七章 回溯(二)

主要内容

  1. 相同集合之间组合
  2. 不同集合之间组合

题目

216. 组合总和 III

思路分析

注意剪枝

代码

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        res = []
        path = []
        
        def backtracking(k, n, start):
            # 剪枝
            if sum(path) > n:
                return
            if len(path) == k:
                if sum(path) == n:
                    res.append(path[:])
                return

            for i in range(start, 10 - (k - len(path)) + 1):
                path.append(i)
                backtracking(k, n, i + 1)
                path.pop()

        backtracking(k, n, 1)
        return res      

17.电话号码的字母组合

思路分析

注意这里的for循环for c in d[digits[index]]
是不同集合之间的组合

代码

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

        res = []
        path = []
        n = len(digits)
        if n == 0:
            return res
        def backtracking(digits,index):
            # index指向digits的下标索引
            if index == n:
                res.append("".join(path))
                return

            for c in d[digits[index]]:
                path.append(c)
                backtracking(digits,index + 1)
                path.pop()
        backtracking(digits, 0)

        return res      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值