216.组合总和III
这题和组合问题差不多,本题中给出的集合是固定的,多了一个和的限制。
class Solution(object):
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
targetSum = n
sum = 0
startindex = 1
res = []
self.backtracking(n, k, sum, startindex, [], res)
return res
def backtracking(self, targetSum, k, sum, startindex, path, res):
if sum > targetSum: # 剪枝,如果元素总和已经大于targetSum了,就没有必要继续往后遍历了
return
if len(path) == k:
if sum == targetSum:
res.append(path[:])
return
for i in range(startindex, 9-(k-len(path))+2): # 与组合问题同样的剪枝,如果for循环起始位置之后的元素个数已经不够还需要的个数了,就不用继续遍历了
path.append(i)
sum += i
self.backtracking(targetSum, k, sum, i+1, path, res)
sum -= i # 回溯
path.pop() # 回溯
17.电话号码的字母组合
1.数字与字母的映射:建立一个字母字符串的数组,下标就是对应的数字
2.本题中不再用startindex,用index来直接表示遍历到digits中的第几个数字了,为什么不用startindex了?因为这次是在两个不同的集合中分别取数来进行组合,遍历的时候不能再从startindex开始了,而是从头开始
class Solution(object):
def __init__(self):
self.lettersMap = [
'', # 0
'', # 1
'abc', # 2
'def', # 3
'ghi', # 4
'jkl', # 5
'mno', # 6
'pqrs', # 7
'tuv', # 8
'wxyz' # 9
]
self.res = [] # 收集结果
self.s = '' # 收集每个字母组合
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if len(digits) == 0:
return []
self.backtracking(digits, 0)
return self.res
def backtracking(self, digits, index):
if index == len(digits): # 终止条件:如输入‘23’,往下递归两层就够了,到达叶子节点收集结果
self.res.append(self.s)
return
digit = int(digits[index]) # index对应的数字
letters = self.lettersMap[digit] # 数字对应的字母集合
for i in range(len(letters)):
self.s += letters[i]
self.backtracking(digits, index+1) # index加一,处理下一个数字
self.s = self.s[:-1] # 回溯