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

216.组合总和III

题目:

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

思路:

参数:n,k  返回:列表

终止条件:设置一个原始列表,包含所有的数字,当这个列表的个数小于k,返回result

单层递归逻辑:

for循环

对于for循环中取值的优化还是有点懵。

代码:

class Solution:
    # 主函数
    def combinationSum3(self, k: int, n: int) -> list[list[int]]:
        result = []  # 接收结果
        self.backtracking(n, k, 0, 1, [], result)  # 传入的参数,及其初始状态
        return result

    # 递归函数
    def backtracking(self, targetSum, k, currentSum, startIndex, path, result):
        if currentSum > targetSum:  # 剪枝:当前的和大于目标的和
            return
        if len(path) == k:  # 当path的长度等于给定的k,可以将其转入结果集中
            if currentSum == targetSum:
                result.append(path[:])
            return
        
        for i in range(startIndex, 9 - (k - len(path)) + 2):  # 剪枝
            currentSum += i
            path.append(i)
            self.backtracking(targetSum, k, currentSum, i + 1, path, result)
            # 回溯
            currentSum -= i
            path.pop()

17.电话号码的字母组合

题目:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

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

思路:

  • 先做映射,建立一个列表;
  • for循环的深度由输入的字符串的个数决定;
  • 在每一个数字所包含的字母的组合里做回溯;

代码:

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
        ]

    # 递归函数
    def getCombinations(self, digits, index, path, result):  # 接收四个参数
        # digits:输入的字符串, index:当前处理的输入的数字的位置, path:当前已经生成的字母组合, result:最终的结果列表

        # 终止条件
        if index == len(digits):  # 说明遍历结束
            result.append(''.join(path))
            return
        # 输入的是字符串,转为整数类型
        digit = int(digits[index])
        letters = self.letterMap[digit]  # 这里代表找索引
        for letter in letters:
            path.append(letter)
            self.getCombinations(digits, index + 1, path, result)
            # 回溯
            path.pop()

    # 主函数
    def letterCombinations(self, digits: str) -> List[str]:
        result = []
        if len(digits) == 0:
            return result
        # 调用递归函数
        self.getCombinations(digits, 0, [], result)
        return result

你可能感兴趣的:(算法)