Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25

216. Combination Sum III

回溯

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

    def backtracking(self, targetSum, curSum, count, startIndex):
        # 终止条件
        if len(self.path) == count:
            if curSum == targetSum:
                self.res.append(self.path.copy())
            return

        for i in range(startIndex, 10):
            self.path.append(i)
            curSum += i
            self.backtracking(targetSum, curSum, count, i+1)    # 递归
            curSum -= i         # 回溯
            self.path.pop()

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

回溯,剪枝优化

已选元素总和如果已经大于targetSum了,那么往后遍历就没有意义了,直接剪掉。

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

    def backtracking(self, targetSum, curSum, count, startIndex):
        # 终止条件
        if len(self.path) == count:
            if curSum == targetSum:
                self.res.append(self.path.copy())
            return

        for i in range(startIndex, 10):
            self.path.append(i)
            curSum += i

            if curSum > targetSum:  # 剪枝
                curSum -= i         # 剪枝之前先把回溯做了
                self.path.pop()
                return

            self.backtracking(targetSum, curSum, count, i+1)    # 递归
            curSum -= i         # 回溯
            self.path.pop()

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

17. Letter Combinations of a Phone Number

这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。

class Solution:
    def __init__(self):
        self.letterMap = [
            '',
            '',
            'abc',
            'def',
            'ghi',
            'jkl',
            'mno',
            'pqrs',
            'tuv',
            'wxyz'
        ]
        self.string = []
        self.res = []

    def backtracking(self, digits, index):
        # 终止条件
        if index == len(digits):
            self.res.append(''.join(self.string.copy()))
            return

        digit = int(digits[index])
        for i in range(len(self.letterMap[digit])):
            self.string.append(self.letterMap[digit][i])
            self.backtracking(digits, index + 1)
            self.string.pop()   # 回溯

    def letterCombinations(self, digits: str) -> List[str]:
        if digits == "": return []
        self.backtracking(digits, 0)
        return self.res

你可能感兴趣的:(算法,leetcode,算法,职场和发展)