day25 代码随想录算法训练营 216. 组合总和 III
题目:216. 组合总和 III
我的感悟:
- 还是按照之前的套路来。
- 多了一个参数path_sum
- 应该是有两处剪枝,1处横线剪枝,1处纵向剪枝?或者说1处求和剪枝?1处范围剪枝?【疑问】
理解难点:
- 不剪枝的已经模的差不多了,剪枝的再看看
自己听了一遍写的:[未剪枝]
class Solution:
def combinationSum3(self, k: int, sum_n: int) -> List[List[int]]:
res = []
path_sum = 0
self.backtrack(k,sum_n,1,[],res,path_sum)
return res
def backtrack(self,k,sum_n,start,path,res,path_sum):
# 退出条件
if len(path) == k:
if path_sum == sum_n:
res.append(path[:])
return
# 核心遍历
for i in range(start,10):
path.append(i)
path_sum += i
self.backtrack(k,sum_n,i+1,path,res,path_sum)
path_sum -= i
path.pop()
剪枝版本:
class Solution:
def combinationSum3(self, k: int, sum_n: int) -> List[List[int]]:
res = []
path_sum = 0
self.backtrack(k,sum_n,1,[],res,path_sum)
return res
def backtrack(self,k,sum_n,start,path,res,path_sum):
# 剪枝1
if path_sum > sum_n:
return
# 退出条件
if len(path) == k:
if path_sum == sum_n:
res.append(path[:])
return
# 核心遍历
for i in range(start,10):
if 10 - i < k - len(path): # 剪枝2
break
path.append(i)
path_sum += i
self.backtrack(k,sum_n,i+1,path,res,path_sum)
path_sum -= i
path.pop()
看来讲解后:
- 确实跟我想的一样!!
- 哈哈,是两个维度的剪枝。
- 从之前的60%->80% 理解了。
通过截图:
扩展写法:
资料:
题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
标签:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本