对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。
本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。
题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
path[:] 在 Python 中表示创建 path 列表的浅拷贝。它的作用是生成一个新的列表,其内容与 path 相同,但它们是不同的对象。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result=[]
self.backtracking(n,k,1,[],result)
return result
def backtracking(self,n,k,startIndex,path,result):
if len(path)==k:
result.append(path[:])
return
for i in range(startIndex,n+1):
path.append(i)
self.backtracking(n,k,i+1,path,result)
path.pop()
如果把 组合问题理解了,本题就容易一些了。题目链接/文章讲解:代码随想录
视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
参照上一题有思路,不需要用双重循环,一个循环即可,条件语句要划清楚
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
result=[]
self.backtracking(n,k,1,[],result,0)
return result
def backtracking(self,n,k,startIndex,path,result,cur_sum):
if len(path)==k:
if cur_sum==n:
result.append(path[:])
return
for i in range(startIndex,10):
if cur_sum+i>n:
break
path.append(i)
self.backtracking(n,k,i+1,path,result,cur_sum+i)
path.pop()
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
题目链接/文章讲解:代码随想录
视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili
穷举
class Solution:
def __init__(self):
self.letterMap=[
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
]
self.result=[]
def letterCombinations(self, digits: str) -> List[str]:
if len(digits)==0:
return self.result
self.backtracking(digits,0,"")
return self.result
def backtracking(self,digits,index,s):
if index==len(digits):
self.result.append(s)
return
digit=int(digits[index])
letters=self.letterMap[digit]
for letter in letters:
self.backtracking(digits,index+1,s+letter)