LeetCode 216.组合总和III
力扣题目链接
回溯算法,本题可以进行剪枝操作,若当前和已经超过了目标和,就没有必要继续遍历下去了,因为后面的一定也会超过目标和,那么这些就可以剪枝掉。
class Solution:
def __init__(self):
self.result = []
self.track = []
self.cur_sum = 0
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtrack(k, n, 1)
return self.result
def backtrack(self, k, n, start):
if len(self.track) == k:
if self.cur_sum == n:
self.result.append(self.track[:])
return
else:
return
for i in range(start, 10):
if self.cur_sum + i <= n: # 剪枝
self.cur_sum += i
self.track.append(i)
self.backtrack(k, n, i + 1)
self.track.pop()
self.cur_sum -= i
LeetCode 17.电话号码的字母组合
力扣题目链接
回溯算法,回溯函数需要输入一个index,指定当前循环遍历哪个数字代表的字母
class Solution:
def __init__(self):
self.strings = [
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
]
self.result = []
self.track = ""
def letterCombinations(self, digits: str) -> List[str]:
if len(digits) == 0:
return []
self.backtrack(digits, 0)
return self.result
def backtrack(self, digits, index):
if len(self.track) == len(digits):
self.result.append(self.track[:])
return
s = self.strings[int(digits[index])]
for i in range(len(s)):
self.track += s[i]
self.backtrack(digits, index + 1)
self.track = self.track[:-1]
今日毕!