day27 回溯算法理论基础 77.组合 216.组合总和 ||| 17.电话号码里的字母组合

77. 组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

第一种方法(回溯算法):

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        path = []
        result = []
        def backtracking(startIndex):
            nonlocal path, result
            if len(path) == k:
                result.append(path.copy())
                return
            for i in range(startIndex, n + 1):
                path.append(i)
                backtracking(i + 1)
                path.pop()

        backtracking(1)
        return result

第二种方法(回溯算法-剪枝优化):

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        path = []
        result = []
        def backtracking(startIndex):
            nonlocal path, result
            if len(path) == k:
                result.append(path.copy())
                return
            for i in range(startIndex, n - (k - len(path)) + 1 + 1):
                path.append(i)
                backtracking(i + 1)
                path.pop()

        backtracking(1)
        return result

216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

第一种方法(回溯算法-剪枝优化):

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        path = []
        result = []

        def backtracking(sum, startIndex):
            nonlocal path, result

            if len(path) == k:
                if sum == n:
                    result.append(path.copy())
                return
                
            for i in range(startIndex, 10 - (k - len(path)) + 1):
                if sum > n:
                    return
                sum += i
                path.append(i)
                backtracking(sum, i + 1)
                sum -= i
                path.pop()
            
        backtracking(0, 1)
        return result            

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

17.电话号码的字母组合

示例:

  • 输入:"23"
  • 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 

说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

第一种方法(回溯算法-剪枝优化):

class Solution:
    def __init__(self):
        self.letterMap = [
            "",     # 0
            "",     # 1
            "abc",  # 2
            "def",  # 3
            "ghi",  # 4
            "jkl",  # 5
            "mno",  # 6
            "pqrs", # 7
            "tuv",  # 8
            "wxyz", # 9
        ]
        self.s = ""
        self.result = []

    def backtracking(self, digits, index):
        if index == len(digits):
            self.result.append(self.s)
            return
        
        digit = int(digits[index])
        letters = self.letterMap[digit]
        for i in range(len(letters)):
            self.s += letters[i]
            self.backtracking(digits, index + 1)
            self.s = self.s[:-1]
    
    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits) == 0:
            return self.result
        self.backtracking(digits, 0)
        return self.result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值