算法第21天 | 第77题. 组合、216. 组合总和 III、17. 电话号码的字母组合
回溯基础概念
什么是回溯?
如何实现回溯?
第77题. 组合
题目
思路与解法
carl的讲解: 回溯搜索法
class Solution:def combine(self, n: int, k: int) -> List[List[int]]:self.path = []self.res = []self.backtracking(n, k, 1)return self.resdef backtracking(self, n, k, startIdx):if len(self.path) == k:self.res.append(self.path[:]) # 遍历path里面的值再存入res中,不然存入的是path的引用,这样存入res中的值就会跟着path变了print(self.path)returnif startIdx > n:returni = startIdxwhile i <= n:self.path.append(i)self.backtracking(n, k, i + 1)self.path.pop()i += 1
216. 组合总和 III
题目
思路与解法
第一想法: 很类似于上一道题,只是终止条件不一样
class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:self.path = []self.sum = 0self.res = []self.backtracking(k, n, 1)return self.resdef backtracking(self, k, n, startIdx):if self.sum == n and len(self.path) == k:self.res.append(self.path[:])returnif len(self.path) > k or self.sum > n or startIdx > 9:returni = startIdxwhile i < 10:self.path.append(i)self.sum += iself.backtracking(k, n, i+1)self.path.pop()self.sum -= ii += 1
17. 电话号码的字母组合
题目
思路与解法
第一想法: 先用字典存入数字和字母的对应关系,然后使用回溯法遍历每个字母段。递归的退出条件是当前取字母的地方是最后一个字母段。
class Solution:def letterCombinations(self, digits: str) -> List[str]:if not digits:return []self.dig2char = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}self.chars = []self.res = []self.path = []for item in digits:self.chars.append(self.dig2char.get(item))self.backtracking(0)return self.resdef backtracking(self,starIdx):if starIdx >= len(self.chars):self.res.append("".join(self.path))returnchars = self.chars[starIdx]for char in chars:self.path.append(char)self.backtracking(starIdx + 1)self.path.pop()