216. 组合总和
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
def back_tracking(result, subset, _sum, start_val):
if len(subset) == k:
if _sum == n:
result.append(subset.copy())
return
for i in range(start_val,9 - (k - len(subset))+ 2):
if i in subset:
continue
_sum += i
subset.append(i)
back_tracking(result, subset, _sum, i + 1)
subset.pop()
_sum -= i
result = []
_sum = 0
subset = []
start_val = 1
back_tracking(result, subset, _sum, start_val)
return result
注意回溯的时候 subset pop的同时_sum要减i
剪枝的时候考虑目前已经添加了len(subset)个元素,还需要k-len(subset)个元素,遍历的话遍历到总的元素9 减掉还需要的元素k-len(subset)之后的数值+1就可以了,因为for i in range 是左闭右开,所以还需要再加一。
17. 电话号码字母组合
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
char_list = [""] * 10
char_list[0] = ' '
char_list[1] = ' '
char_list[2] = 'abc'
char_list[3] = 'def'
char_list[4] = 'ghi'
char_list[5] = 'jkl'
char_list[6] = 'mno'
char_list[7] = 'pqrs'
char_list[8] = 'tuv'
char_list[9] = 'wxyz'
def back_tracking(digits, subset, index):
if len(subset) == len(digits):
if subset:
result.append(''.join(subset.copy()))
return result
for i in char_list[int(digits[index])]:
subset.append(i)
back_tracking(digits, subset, index + 1)
subset.pop()
result = []
subset = []
index = 0
back_tracking(digits, subset, index)
return result
和前面的组合问题不同,这次的回溯是从两个不同的集合取值,所以每次递归调用的时候,需要一个参数index来控制去不同的集合取值。