算法讲解

a187927218313 天前
算法·leetcode·二叉树··bfs·算法讲解·树遍历
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流树系列第二篇。上半场 BFS:LC102 层序遍历立骨架(一次"DFS 硬凑层序"的失败尝试引出一堂 slice 值语义课——子函数里的 append 回不到调用者的 slice;正解是队列 + len 快照,“先冻结规模,再动队列”),然后一个骨架吃下三个配件:LC199 右视图(i == size-1)、LC103 锯齿形(一个 Reverse 引发的"每步反转"bug——2 节点的层碰巧对、4 节点的层才暴露,用例巧合家族再添一案)、LC107 自底向上(一行配件)。下半场 Boss:LC236 最
a187927218318 天前
算法·leetcode·双指针·滑动窗口·原理·相向双指针·算法讲解
【算法】双指针与滑动窗口(三):相向双指针——比较、排除、收缩双指针系列第三篇,相向双指针专题。三道题讲透"比较、排除、收缩":LC167 两数之和 II(裸题;一版过,但这题的判决书有个反直觉的结构——淘汰 r 时,论证的全部内容却是 l 的未来:"不动的那边"才是死刑判决的依据);LC11 盛最多水的容器(排除论证的原题;代码一次过、证明欠着的病历——“谁矮动谁"凭什么安全,矮边的所有剩余配对上限 ≤ 已记录值;以及"排序的自由度”:LC15 的下标是身份标签、LC11 的下标是坐标);LC15 三数之和(boss;四版弧线——把双指针写成递归回溯的六 if 平
a1879272183110 天前
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出双指针系列第二篇,滑动窗口专题。三道题讲透"吃进、判定、吐出":LC3 无重复最长子串(最长型;从 DP 的"断链"惯性走到滑窗的"收缩",五版弧线的教训,以及重做时的一次架构升级——计数版把哨兵坑和窗口外旧出现坑整类消灭);LC209 长度最小的子数组(最短型;“移出前预判"与"破坏后记录"两种收缩写法;以及本文最值钱的一段——负数死亡证明:正整数给滑窗的命根子是"移出单调减”,负数打破它之后存在"先蹲后跳"的移出路径,双指针的 l 只进不退、无法表达起点回退,滑窗当场死亡——这就是 LC862 必须换
a1879272183113 天前
算法·leetcode·区间·双指针·滑动窗口·原理·算法讲解
【算法】双指针与滑动窗口(一):框架总纲——三类问题、一个原理与判决书双指针/滑动窗口系列第一篇,只讲框架不讲题。这个结构本身是一次纠错的结果:我先前按"一题一题做、批改里提炼要点"的方式学这个系列(LC3 写了五版、LC15 四版、LC76 一版过但被拷问),十来道题做完,某天被自己问倒——"双指针的核心原理到底是什么?"竟然答不上来。回溯系列我有"选择、递归、回退"六个字,DP 系列我有手推表,双指针……只有一堆散落的教训。这篇就是补课:一个统一原理(被跳过的候选不可能是答案)、三大类地图(滑动窗口/相向双指针/二分,各自的模板与旋钮)、一份判决书规范(排除要有论证、幸
a1879272183117 天前
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭DP 系列第四篇,背包三课的后两讲。LC322 零钱兑换(最值背包):一次翻出三个缺口——min 合并被赋值覆盖吃掉(覆盖病第三案)、哨兵 -1 在 min 世界传染(-1+1=0 冒充最优解,实测算出比数学下界还小的答案 15 < 20)、+dp[c] 的巧合依赖;沉淀出哨兵配对原则的进阶版:min 世界的哨兵必须"大而无害"。LC518 零钱兑换 II(计数背包):卡壳三弯——种子 dp[0]=1(空集是凑 0 元的唯一方式)、+ 合并(四族合并符集齐)、正序(0-1 背包的倒序惯性不能带来完全背包)
a1879272183117 天前
算法·leetcode·动态规划·贪心·dp·暴力·算法讲解
【算法】动态规划第三篇:背包第一课——贪心之死与正序倒序开关DP 系列第三篇,第 3 级背包开篇。一道「分割等和子集」(LC416),走完了四个版本的完整弧线:贪心版(自己造反例亲手击毙)→ 回溯版(正确,但 25 个元素实测 3300 万次调用)→ 二维 bool 背包(target 错、种子缺、返回格子错,三 bug 一堂课)→ 一维滚动(正序陷阱 + 赋值覆盖,两个坑一次踩完)。沉淀出背包世界的四块拼图:转化(target = sum/2)、种子(dp[i][0] = true)、或族合并(max/min/|| 三族集齐)、以及最值钱的一块——正序倒序开关(
a1879272183117 天前
算法·leetcode·动态规划·dp·区间·区间dp·算法讲解
【算法】动态规划第五篇:区间 DP——从“看什么都像背包“到“最后戳谁“DP 系列第五篇,第 4 级区间 DP 两课全记录。LC516 最长回文子序列:开局把区间题误判成 0-1 背包(刚考完背包的范式惯性),自己爬出来后四要素(区间定义 / 两端转移 / 计算顺序 / 右上角答案)全部自推成功,卡在一个 j 的下标语义错位(1..n vs 0..n-1)上 panic 现场被抓——手推表和代码必须严格同构的教训落地。LC312 戳气球(hard,区间 DP 天花板):排列/组合的背包语言整体失效(所有气球都要戳光,没有子集自由度);钥匙是盯"最后戳破的气球 k"而不是"最先
a1879272183118 天前
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链DP 第一篇(打家劫舍三版演化 → 最大子数组 → LIS)收官在一维。这一篇进二维双序列,一天三题:最长公共子序列(LC1143)→ 编辑距离(LC72)→ 最长重复子数组(LC718)。三题骨架相同(dp[i][j] 看两处末尾),灵魂各异:LCS 是继承型(不等时 max 搬运)、编辑距离是计步型(三操作各消一个末尾)、子数组是断链型(不等归零)。踩的坑包括:两个 bug 互相抵消的测试陷阱、dp[0][0] 的语义漂移、“结尾限定型"的惯性误用、手推表"结果对过程错”、以及 go1.21 内建 m
a1879272183119 天前
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗回溯系列第三篇,收官。上一篇以 LC842 验收"毕业",我以为真毕业了——接下来三记重锤锤醒了梦:记忆化的三次错位(417 万次调用 vs 176 次,缓存选择、缓存候选、只写不读一路踩过去)、排序被禁后的去重(层属性 vs 路径属性,usedThisLevel 不还原是精髓)、中间态失控(把 Go 的栈撑爆 1GB)。三锤全部指向同一件事:状态设计。最后用 N 皇后收官(对角线编号 r±c + 三个标记数组 + 四动作对),并把整个系列沉淀成三层漏斗识别框架和写题前的终极检查清单。本篇也是通往动态规划
a1879272183120 天前
算法·leetcode·go·回溯·leetcode93·ip复原·算法讲解
【算法】回溯算法(一):从一道 IP 题到万能模板回溯系列第一篇,入门。从「复原 IP 地址」这道经典题出发,完整走一遍回溯的标准建模流程:把约束拆干净 → 画决策树 → 套三要素 → 三层剪枝 → 写代码 → 踩题内小坑。最后沉淀出一份可复用的回溯模板——八字口诀「判终、砍支、循环三连」,加上决策三形态和三验证。本篇是纯入门,一次车都不翻;翻车实录在第二篇,五个坑一个比一个深。
我是有底线的