1.LeetCode 77 组合
题目链接:77. 组合
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
def backtracking(n, k, startIndex, path, result):
if len(path) == k:
result.append(path[:])
return
for i in range(startIndex, n - (k - len(path)) + 2):
path.append(i)
backtracking(n, k, i + 1, path, result)
path.pop()
result = []
backtracking(n, k, 1, [], result)
return result
确实不好理解
第一题结束
2.LeetCode 216 组合总和 III
题目链接:216. 组合总和 III
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
def backtracking(k, n, Sum, Index, path, result):
if Sum > n:
return
if len(path) == k:
if Sum == n:
result.append(path[:])
return
for i in range(Index, 9 - (k - len(path)) + 2):
Sum += i
path.append(i)
backtracking(k, n, Sum, i + 1, path, result)
Sum -= i
path.pop()
result = []
backtracking(k, n, 0, 1, [], result)
return result
跟前面那题差不多
3.LeetCode 17 电话号码的字母组合
题目链接:17. 电话号码的字母组合
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
lettermap = ["",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz" ]
result = []
s = ''
def backtracking(digits, Index):
nonlocal s, result
if Index == len(digits):
result.append(s)
return
digit = int(digits[Index])
letters = lettermap[digit]
for i in range(len(letters)):
s += letters[i]
backtracking(digits, Index + 1)
s = s[:-1]
if len(digits) == 0:
return result
backtracking(digits, 0)
return result
还行吧
今天用时2.5h,回溯比二叉树好理解点