day24 代码随想录算法训练营 77.组合--剪枝优化
题目:
还是组合
我的感悟:
- 多看看别人写的,找一找自己更好理解的。
- 看了灵山的,和卡尔的,最后在卡尔视频下面的评论找到我更理解的。
理解难点:
- 注意距离的概念
- 其他都不动,就增加一行,如果后续的长度不够了。就break
代码优化后的:
from typing import List
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res = []
self.backtrack(n, k, 1, [], res)
return res
def backtrack(self, n, k, start_index, tmp_path, result):
# 特殊
if len(tmp_path) == k: # 满足要求就记录
result.append(tmp_path[:])
return
# 核心
for i in range(start_index, n + 1): # 要取到n
if n + 1 - i < k - len(tmp_path): # i是开始位置,如果从i开始到n+1的长度, 小于所需要的长度,就不要后面的了【注意这里是距离,距离的概念】
break
tmp_path.append(i)
self.backtrack(n, k, i + 1, tmp_path, result)
tmp_path.pop()
今日独立再写一次:
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res = []
self.backtrack(n,k,1,[],res)
return res
def backtrack(self,n,k,start,path,result):
# 特殊
if len(path) == k:
result.append(path[:])
# 核心遍历
for i in range(start,n+1):
if n+1 -i < k - len(path): # 剪枝 如果后面的不够需要的就跳过
break
path.append(i)
self.backtrack(n,k,i+1,path,result)
path.pop()