第7章|回溯与搜索

Unit 02 · LeetCode #77 · 优化版

← Unit 01
77
CombinationsFixed Depth · Capacity Pruning

只记录填满 K 个位置的状态,
提前拒绝永远填不满的选择。

path 与 start 延续子集模型;组合题新增固定深度与容量约束。真正值得掌握的不是公式本身,而是它证明了哪些候选已经不可能完成。

题目要求

给定两个整数 n 和 k,返回范围 [1,n] 中所有可能的 k 个数的组合。组合不考虑顺序,答案顺序任意。

class Solution: def combine(self, n: int, k: int) -> List[List[int]]: pass
  • 只有长度恰好为 k 的路径是答案;
  • 下一层从 value+1 开始,保证严格递增;
  • 答案数量为 C(n,k)。

教学实验

n = 5, k = 3 完整答案示例:[1,3,5] 中间状态示例:[1,3]
need = k - len(path) max_value = n - need + 1 range 的排他终点 = max_value + 1

主方法仍为回溯,但本页只训练三个新增点:固定记录时机、容量剪枝的证明,以及 Python 排他边界。

固定深度只有 len(path)==k 才记录,较短路径只是中间状态。
need还缺多少个位置:k-len(path)。
最大候选n-need+1 是本层最后一个仍可能完成的选择。
排他终点Python range 不包含右端,因此代码写 max_value+1。
检测到本单元进度
教学搜索树|n=5,k=3
绿色底线:完整组合橙色:当前状态黄色:可操作候选红色:容量不足
组合搜索契约
当前 start
还缺 need
本层最大候选
已记录答案数
当前候选窗口
补全 LeetCode #77 提交代码7 个语义槽位
代码—need—候选上界联动在排他边界处暂停
代码槽位与关键轨迹都完成后,本环节结束槽位表达算法契约;轨迹验证排他边界和状态恢复。

Unit 02 Skill 总结

状态path、start、need
答案条件len(path)==k
容量剪枝max=n-need+1
Python 边界range(start,max+1)
唯一性下一层 value+1
迁移#216 再增加 remaining
本环节已完成

页面将保留当前状态。可以继续观察,也可以进入下一环节。

全屏代码编辑