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 不对应任何字母。
示例:
- 输入:"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