Day25 | 回溯

51 阅读1分钟

216. 组合总和 III

和组合一样的思路,但这样写计算sum,复杂度较大

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

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

    return res

用summ变量

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

    def recursion(n, j, k, summ):
        if len(path) == k and summ == n:
            res.append(path[:])
            return
        
        for i in range(j, 10):
            path.append(i)
            summ += i
            recursion(n, i+1, k, summ)
            p = path.pop()
            summ -= p
        
    recursion(n, 1, k, 0)

    return res

17. 电话号码的字母组合

如果path用str的类型,不能成为中间变量赋值

关键是要用键盘的dict构建对应数组,在遍历过程中改变位置时,改变遍历的字符串digits[i]

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

    path = []
    res = []
    
    def recursion(digits, i):
        if len(path) == len(digits):
            p = ''.join(path[:])
            res.append(p)
            return
        
        # digits
        letters = dic[digits[i]]
        # print(letters)
        for l in letters:
            path.append(l)
            recursion(digits, i+1)
            path.pop()

    recursion(digits, 0)

    return res

或者定义类,用变量形式创建中间变量ans

class Solution:
    def __init__(self):
        self.res = []
        self.ans = ''
        self.dic = { 
                '2': 'abc',
                '3': 'def',
                '4': 'ghi',
                '5': 'jkl',
                '6': 'mno',
                '7': 'pqrs',
                '8': 'tuv',
                '9': 'wxyz'}
        
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits: 
            return []
        self.recursion(digits,0)
        return self.res
    
    def recursion(self,digits,i):
        if len(self.ans) == len(digits):
            self.res.append(self.ans)
            return
        
        letters: str = self.dic[digits[i]]
        for letter in letters:
            self.ans += letter   # 处理
            self.recursion(digits, i + 1)    # 递归至下一层
            self.ans = self.ans[:-1]