<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hot100 on Jeanphilo Blog</title><link>https://jeanphilogong.github.io/jeanblog/zh/tags/hot100/</link><description>Recent content in Hot100 on Jeanphilo Blog</description><generator>Hugo -- 0.168.0</generator><language>zh-cn</language><lastBuildDate>Sat, 10 Oct 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://jeanphilogong.github.io/jeanblog/zh/tags/hot100/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode 49：字母异位词分组，从逐组比较到构造分组键</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/49-group-anagrams/</link><pubDate>Sat, 10 Oct 2026 10:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/49-group-anagrams/</guid><description>用 Python 从两个字符串的异位词判断出发，先写出逐组扫描的正确解，再推导排序键与字符计数键，理解哈希表分组为什么成立。</description></item><item><title>LeetCode 152：乘积最大子数组，从负数反例推导双状态动态规划</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/152-maximum-product-subarray/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/152-maximum-product-subarray/</guid><description>先枚举非空连续区间，再用负数反例推导最大与最小乘积状态，逐步得到常数空间的 Python 解法。</description></item><item><title>LeetCode 279：完全平方数，从剩余和推导动态规划</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/279-perfect-squares/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/279-perfect-squares/</guid><description>从最大平方数优先的失败例子出发，逐步构建递归、记忆化与迭代动态规划，求组成整数所需的最少完全平方数。</description></item><item><title>LeetCode 139：单词拆分，从前缀是否可达开始</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/139-word-break/</link><pubDate>Tue, 22 Sep 2026 12:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/139-word-break/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：字符串 &lt;code&gt;s&lt;/code&gt; 和字符串列表 &lt;code&gt;wordDict&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wordDict&lt;/code&gt; 中的每个元素都是一个可以使用的单词；同一个单词可以重复使用&lt;/li&gt;
&lt;li&gt;输出：如果 &lt;code&gt;s&lt;/code&gt; 可以被拆成一个或多个字典单词，返回 &lt;code&gt;True&lt;/code&gt;；否则返回 &lt;code&gt;False&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;拆分必须覆盖整个字符串，不能跳过字符，也不能改变字符顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：s = &amp;#34;leetcode&amp;#34;, wordDict = [&amp;#34;leet&amp;#34;, &amp;#34;code&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：True
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：&amp;#34;leetcode&amp;#34; 可以拆成 &amp;#34;leet&amp;#34; + &amp;#34;code&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：s = &amp;#34;applepenapple&amp;#34;, wordDict = [&amp;#34;apple&amp;#34;, &amp;#34;pen&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：True
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：&amp;#34;apple&amp;#34; + &amp;#34;pen&amp;#34; + &amp;#34;apple&amp;#34;；同一个单词可以重复使用
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：s = &amp;#34;catsandog&amp;#34;, wordDict = [&amp;#34;cats&amp;#34;, &amp;#34;dog&amp;#34;, &amp;#34;sand&amp;#34;, &amp;#34;and&amp;#34;, &amp;#34;cat&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：False
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：前面可以拼出一些片段，但最后不能覆盖完整字符串
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="约束"&gt;约束&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= s.length &amp;lt;= 300&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= wordDict.length &amp;lt;= 1000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= wordDict[i].length &amp;lt;= 20&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; 和 &lt;code&gt;wordDict[i]&lt;/code&gt; 只包含小写英文字母&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wordDict&lt;/code&gt; 中的单词互不相同&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-1先让已完成的前缀变得可见"&gt;Step 1：先让“已完成的前缀”变得可见&lt;/h2&gt;
&lt;p&gt;先只问一个具体问题：对于 &lt;code&gt;s = &amp;quot;leetcode&amp;quot;&lt;/code&gt;，在确认整串能否拆开之前，我们能不能先记录“已经拆完了哪一段”？&lt;/p&gt;</description></item><item><title>LeetCode 213：打家劫舍 II，环形拆成两个线性问题</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/213-house-robber-ii/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/213-house-robber-ii/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：整数数组 &lt;code&gt;nums&lt;/code&gt;，&lt;code&gt;nums[i]&lt;/code&gt; 表示第 &lt;code&gt;i&lt;/code&gt; 间房子的金额。&lt;/li&gt;
&lt;li&gt;房子首尾相连，不能偷相邻的两间房子，因此第 &lt;code&gt;0&lt;/code&gt; 间和第 &lt;code&gt;n - 1&lt;/code&gt; 间也不能同时偷。&lt;/li&gt;
&lt;li&gt;输出：在不触发警报的前提下，最多能偷到的金额。&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 100&lt;/code&gt;，&lt;code&gt;0 &amp;lt;= nums[i] &amp;lt;= 1000&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [2,3,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：第 0 间和第 2 间首尾相邻，不能同时偷；选择金额 3 的房子。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：可以偷下标 0 和下标 2，也可以偷下标 1 和下标 3。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，先从最小的首尾冲突开始。&lt;/p&gt;
&lt;h2 id="step-1先处理首尾相邻的冲突"&gt;Step 1：先处理首尾相邻的冲突&lt;/h2&gt;
&lt;p&gt;先问一个具体问题：&lt;code&gt;nums = [2,3,2]&lt;/code&gt; 时，能不能沿用直线街道的做法，直接在整个数组上选择不相邻的房子？&lt;/p&gt;
&lt;p&gt;当前基线只有一条规则：相邻房子不能同时偷。若把这三个数当成直线，可能会把下标 &lt;code&gt;0&lt;/code&gt; 和下标 &lt;code&gt;2&lt;/code&gt; 当成彼此不相邻，从而错误地选择两端，得到金额 &lt;code&gt;4&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这在环形输入上就会失败：首尾也相邻，&lt;code&gt;0&lt;/code&gt; 和 &lt;code&gt;2&lt;/code&gt; 必须互斥。要消除这一个冲突，只增加一个分支规则：任何合法方案至少属于下面一个候选分支。&lt;/p&gt;</description></item><item><title>LeetCode 322：零钱兑换，从更小金额推出完全背包 DP</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/322-coin-change/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/322-coin-change/</guid><description>从零钱兑换中的贪心失败和更小金额问题出发，逐步构建求最少硬币数量的完全背包动态规划。</description></item><item><title>LeetCode 300：最长递增子序列，从“以 i 结尾”推出序列 DP</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/300-longest-increasing-subsequence/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/300-longest-increasing-subsequence/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：整数数组 &lt;code&gt;nums&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出：返回 &lt;code&gt;nums&lt;/code&gt; 的最长严格递增子序列长度&lt;/li&gt;
&lt;li&gt;子序列保持原数组中的相对顺序，但不要求连续，可以跳过元素&lt;/li&gt;
&lt;li&gt;如果选择的下标是 &lt;code&gt;i_1 &amp;lt; i_2 &amp;lt; ... &amp;lt; i_k&lt;/code&gt;，还必须满足 &lt;code&gt;nums[i_1] &amp;lt; nums[i_2] &amp;lt; ... &amp;lt; nums[i_k]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;子序列非空，因此至少选择一个元素&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 2500&lt;/code&gt;，&lt;code&gt;-10^4 &amp;lt;= nums[i] &amp;lt;= 10^4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [10,9,2,5,3,7,101,18]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：[2,5,7,101] 是一个长度为 4 的严格递增子序列；它不要求在原数组中连续。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [0,1,0,3,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：[0,1,2,3] 的长度为 4；`[0,1,3]` 也是合法但更短的选择。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，从“每个位置结尾能形成多长”这个局部问题开始，逐步写出可运行解法。&lt;/p&gt;
&lt;h2 id="step-1先问以哪个位置结束"&gt;Step 1：先问“以哪个位置结束？”&lt;/h2&gt;
&lt;p&gt;先看第一个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;下标： 0 1 2 3 4 5 6 7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;数值： 10 9 2 5 3 7 101 18
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;答案 &lt;code&gt;[2,5,7,101]&lt;/code&gt; 跳过了 &lt;code&gt;9&lt;/code&gt; 和 &lt;code&gt;3&lt;/code&gt;。当我们走到值为 &lt;code&gt;7&lt;/code&gt; 的位置时，不能只问“它左边相邻的数是谁”，而要问：&lt;/p&gt;</description></item><item><title>LeetCode 416：分割等和子集，从目标总和推到 0/1 背包倒序遍历</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/416-partition-equal-subset-sum/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/416-partition-equal-subset-sum/</guid><description>从分割等和子集的题目压力出发，逐步建立 0/1 背包状态，并解释为什么一维压缩必须倒序遍历。</description></item><item><title>LeetCode 155：最小栈，如何让最小值跟着栈一起变化</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/155-min-stack/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/155-min-stack/</guid><description>从弹出当前最小值后必须恢复历史最小值的压力出发，逐步构建 LeetCode 155 Min Stack。</description></item><item><title>LeetCode 20：有效的括号，为什么数量相同仍然无效</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/20-valid-parentheses/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/20-valid-parentheses/</guid><description>从反例 ([)] 出发，区分括号数量相同与括号类型、闭合顺序真正匹配，为 LeetCode 20 建立可验证的题意基础。</description></item><item><title>LeetCode 394：字符串解码，如何保存并恢复嵌套上下文</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/394-decode-string/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/394-decode-string/</guid><description>从嵌套编码会打断外层解码的压力出发，逐步构建 LeetCode 394 Decode String。</description></item><item><title>LeetCode 153：寻找旋转排序数组中的最小值</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/153-find-minimum-in-rotated-sorted-array/</link><pubDate>Tue, 28 Jul 2026 16:13:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/153-find-minimum-in-rotated-sorted-array/</guid><description>从线性扫描基线推导包含最小值的闭区间与二分更新，在 O(log n) 时间、O(1) 额外空间内返回旋转数组的最小值。</description></item><item><title>LeetCode 33：搜索旋转排序数组</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/33-search-in-rotated-sorted-array/</link><pubDate>Tue, 28 Jul 2026 15:40:34 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/33-search-in-rotated-sorted-array/</guid><description>从线性扫描基线推导旋转数组中的有序半区与目标范围判断，在 O(log n) 时间、O(1) 额外空间内完成搜索。</description></item><item><title>LeetCode 84：柱状图中最大的矩形，连续区间的高度由谁决定</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/84-largest-rectangle-in-histogram/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/84-largest-rectangle-in-histogram/</guid><description>从连续区间的最矮柱限制出发，先构造枚举区间 baseline，再推导按柱高结算最大宽度的线性单调栈解法。</description></item><item><title>LeetCode 136：只出现一次的数字，如何在常量空间排除重复元素</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/136-single-number/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/136-single-number/</guid><description>从集合配对 baseline 出发，推导 XOR 抵消重复元素，在线性时间和常量额外空间内解决 LeetCode 136。</description></item><item><title>LeetCode 338：比特位计数，如何复用较小数字的结果</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/338-counting-bits/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/338-counting-bits/</guid><description>从对 0..n 每个数字重复统计的 baseline 出发，推导 answer[i] = answer[i &amp;amp; (i - 1)] + 1，在线性时间内完成比特位计数。</description></item><item><title>LeetCode 739：每日温度，如何找到右侧第一个更高温度</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/739-daily-temperatures/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/739-daily-temperatures/</guid><description>从向右扫描的 O(n²) baseline 出发，推导维护未解决日期的单调索引栈，在线性时间内解决 LeetCode 739 每日温度。</description></item><item><title>LeetCode 45：跳跃游戏 II，从可达边界升级到最少跳数</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/45-jump-game-ii/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/45-jump-game-ii/</guid><description>从 LeetCode 55 的 farthest 可达边界出发，推导 LeetCode 45 跳跃游戏 II：用 current_end 表示当前跳数覆盖边界，用 farthest 表示下一跳最远覆盖，最终得到最少跳数贪心。</description></item><item><title>LeetCode 435：无重叠区间，从删除最少转成保留最多</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/435-non-overlapping-intervals/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/435-non-overlapping-intervals/</guid><description>从删除哪个区间的选择压力出发，推导 LeetCode 435 无重叠区间：先把最少删除转换成最多保留，再逐步推出按结束位置排序的区间贪心。</description></item><item><title>LeetCode 452：用最少数量的箭引爆气球，从共同交集推出区间贪心</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/452-minimum-number-of-arrows-to-burst-balloons/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/452-minimum-number-of-arrows-to-burst-balloons/</guid><description>从一支箭能覆盖哪些气球出发，推导 LeetCode 452 用最少数量的箭引爆气球：先写共同交集扫描基线，再压缩成按结束位置排序的 arrow_pos 贪心。</description></item><item><title>LeetCode 121：买卖股票的最佳时机，从历史最低价推出一次交易贪心</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/121-best-time-to-buy-and-sell-stock/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/121-best-time-to-buy-and-sell-stock/</guid><description>从买入必须早于卖出的顺序压力出发，推导 LeetCode 121 买卖股票的最佳时机：先写 O(n^2) 正确基线，再压缩成维护历史最低价的一次扫描贪心。</description></item><item><title>LeetCode 55：跳跃游戏，用最远覆盖范围判断能否到达终点</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/55-jump-game/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/greedy/55-jump-game/</guid><description>从会卡在 0 的失败样例出发，推导 LeetCode 55 跳跃游戏：先用 reachable 数组建立正确基线，再压缩成维护 farthest 最远覆盖范围的贪心。</description></item><item><title>LeetCode 200：岛屿数量，把网格陆地看成连通分量</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/union-find/200-number-of-islands/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/union-find/200-number-of-islands/</guid><description>从网格中相邻陆地的合并压力出发，用并查集推导 LeetCode 200 岛屿数量，讲清二维坐标映射、陆地初始 count、union 后 count 什么时候减少。</description></item><item><title>并查集模板：find / union / count 从零推导</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/union-find/union-find-template/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/union-find/union-find-template/</guid><description>从一个集合合并小任务出发，推导并查集模板中的 parent、find、union、count 和路径压缩，最终得到可直接背写的 Python 模板。</description></item><item><title>LeetCode 208：实现 Trie（前缀树）模板题解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/trie/208-implement-trie-prefix-tree/</link><pubDate>Wed, 24 Jun 2026 17:38:48 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/trie/208-implement-trie-prefix-tree/</guid><description>LeetCode 208 Implement Trie 是 Trie 模板题，核心是按固定接口实现 insert、search 和 startsWith。</description></item><item><title>Trie 模板：从节点字段到插入查询 invariant</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/trie/trie-template/</link><pubDate>Wed, 24 Jun 2026 17:38:48 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/trie/trie-template/</guid><description>从零搭一个 Trie 模板，重点理解每个节点存什么、children 怎么走、is_end 为什么需要，以及 insert/search 的循环 invariant。</description></item><item><title>LeetCode 547：省份数量，把邻接矩阵看成图的连通分量</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/547-number-of-provinces/</link><pubDate>Wed, 27 May 2026 00:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/547-number-of-provinces/</guid><description>从邻接矩阵的直接连接关系出发，把 LeetCode 547 省份数量转成无向图连通分量计数问题，再逐步推出 DFS、BFS 和并查集解法。</description></item><item><title>LeetCode 198：打家劫舍，从偷或不偷推出一维 DP</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/198-house-robber/</link><pubDate>Sun, 03 May 2026 14:33:39 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/198-house-robber/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：整数数组 &lt;code&gt;nums&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nums[i]&lt;/code&gt; 表示第 &lt;code&gt;i&lt;/code&gt; 间房子的金额&lt;/li&gt;
&lt;li&gt;不能偷相邻房子&lt;/li&gt;
&lt;li&gt;输出：返回最多能偷到的金额&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 100&lt;/code&gt;，&lt;code&gt;0 &amp;lt;= nums[i] &amp;lt;= 400&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：偷下标 0 和下标 2，金额 1 + 3 = 4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [2,7,9,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：偷下标 0、2、4，金额 2 + 9 + 1 = 12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，从这个二选一冲突推出一维 DP。&lt;/p&gt;
&lt;h2 id="从-1231-的相邻冲突开始"&gt;从 &lt;code&gt;[1,2,3,1]&lt;/code&gt; 的相邻冲突开始&lt;/h2&gt;
&lt;p&gt;看例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums = [1,2,3,1]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果偷下标 &lt;code&gt;2&lt;/code&gt; 的房子，金额是 &lt;code&gt;3&lt;/code&gt;，那么下标 &lt;code&gt;1&lt;/code&gt; 和下标 &lt;code&gt;3&lt;/code&gt; 都不能偷。
如果不偷下标 &lt;code&gt;2&lt;/code&gt;，答案可能来自前面下标 &lt;code&gt;0..1&lt;/code&gt; 的最优结果。&lt;/p&gt;
&lt;p&gt;所以走到某一间房时，核心选择只有两个：&lt;/p&gt;</description></item><item><title>LeetCode 53：最大子数组和，从 dp[i] 含义推出 Kadane</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/53-maximum-subarray/</link><pubDate>Sun, 03 May 2026 14:25:07 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/53-maximum-subarray/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：整数数组 &lt;code&gt;nums&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出：返回连续非空子数组的最大和&lt;/li&gt;
&lt;li&gt;子数组必须连续&lt;/li&gt;
&lt;li&gt;至少选一个元素&lt;/li&gt;
&lt;li&gt;约束：&lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10^5&lt;/code&gt;，&lt;code&gt;-10^4 &amp;lt;= nums[i] &amp;lt;= 10^4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：[4,-1,2,1] 的和最大，为 6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，从 &lt;code&gt;dp[i]&lt;/code&gt; 的含义一步一步推出 Kadane 算法。&lt;/p&gt;
&lt;h2 id="从--21-34-的断点开始"&gt;从 &lt;code&gt;[-2,1,-3,4]&lt;/code&gt; 的断点开始&lt;/h2&gt;
&lt;p&gt;看一个前缀例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums = [-2, 1, -3, 4]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果走到 &lt;code&gt;4&lt;/code&gt;，有两种选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把前面的某个连续子数组接到 &lt;code&gt;4&lt;/code&gt; 前面&lt;/li&gt;
&lt;li&gt;从 &lt;code&gt;4&lt;/code&gt; 自己重新开始&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里的关键不是“所有子数组怎么枚举”，而是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当我们决定一个最优子数组必须以当前位置结尾时，它的来源只有两种：接上前一个位置的最优结尾，或者从当前位置重新开始。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这就是一维 DP 的入口。&lt;/p&gt;
&lt;h2 id="step-1先定义一个更小的问题"&gt;Step 1：先定义一个更小的问题&lt;/h2&gt;
&lt;p&gt;直接问“整个数组的最大子数组和是多少”太大。我们先强加一个限制：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果子数组必须以第 &lt;code&gt;i&lt;/code&gt; 个元素结尾，它的最大和是多少？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个值记为 &lt;code&gt;dp[i]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;dp[i]&lt;/code&gt; 不是“前 &lt;code&gt;i&lt;/code&gt; 个元素里的最大子数组和”。它更窄：&lt;/p&gt;</description></item><item><title>LeetCode 78：子集，从搜索树推出 startIndex 回溯模板</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/78-subsets/</link><pubDate>Sun, 03 May 2026 14:25:07 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/78-subsets/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：&lt;code&gt;nums&lt;/code&gt;，长度 &lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;元素范围：&lt;code&gt;-10 &amp;lt;= nums[i] &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;所有元素互不相同&lt;/li&gt;
&lt;li&gt;输出：返回 &lt;code&gt;nums&lt;/code&gt; 的所有可能子集&lt;/li&gt;
&lt;li&gt;顺序：结果顺序不限，子集内部不需要考虑排列顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python 构造一个最小可运行解法。&lt;/p&gt;
&lt;h2 id="从-12-的搜索树开始"&gt;从 &lt;code&gt;[1,2]&lt;/code&gt; 的搜索树开始&lt;/h2&gt;
&lt;p&gt;最小但有分叉的例子是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums = [1,2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;答案应该是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[], [1], [1,2], [2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意这里没有 &lt;code&gt;[2,1]&lt;/code&gt;。这说明问题不是“随便排列所有选择”，而是“每个元素选或不选，且同一组元素只出现一次”。&lt;/p&gt;
&lt;p&gt;如果把构造过程画成树：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- [1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| |- [1,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- [2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这棵树暴露出两个事实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个节点都是一个合法子集。&lt;/li&gt;
&lt;li&gt;进入 &lt;code&gt;[1]&lt;/code&gt; 之后，后面只能继续看 &lt;code&gt;2&lt;/code&gt;，不能回头再选 &lt;code&gt;1&lt;/code&gt; 或生成 &lt;code&gt;[2,1]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-1先说清楚一个递归层在解决什么"&gt;Step 1：先说清楚一个递归层在解决什么&lt;/h2&gt;
&lt;p&gt;如果当前已经选出一个 &lt;code&gt;path&lt;/code&gt;，剩下的问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;从某个起点之后的元素里，继续选择若干个元素，扩展当前 &lt;code&gt;path&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个“某个起点”必须被记下来。否则 &lt;code&gt;[1,2]&lt;/code&gt; 和 &lt;code&gt;[2,1]&lt;/code&gt; 会从不同路径重复出现。&lt;/p&gt;
&lt;p&gt;先写最小骨架。它只保留两个状态：&lt;/p&gt;</description></item><item><title>LeetCode 90：子集 II，从重复分支推出层内去重</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/90-subsets-ii/</link><pubDate>Sun, 03 May 2026 14:25:07 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/90-subsets-ii/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;h3 id="输入输出"&gt;输入输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入：&lt;code&gt;nums&lt;/code&gt;，长度 &lt;code&gt;1 &amp;lt;= nums.length &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;元素范围：&lt;code&gt;-10 &amp;lt;= nums[i] &amp;lt;= 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nums&lt;/code&gt; 可能有重复元素&lt;/li&gt;
&lt;li&gt;输出：返回所有不重复子集&lt;/li&gt;
&lt;li&gt;顺序：结果顺序不限，但同一个值序列的子集只能出现一次&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入：nums = [1,2,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[[],[1],[1,2],[1,2,2],[2],[2,2]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇只用 Python，从一个能跑但浪费的版本，一步一步过渡到排序 + 层内去重。&lt;/p&gt;
&lt;h2 id="从-122-的重复分支开始"&gt;从 &lt;code&gt;[1,2,2]&lt;/code&gt; 的重复分支开始&lt;/h2&gt;
&lt;p&gt;最小能暴露问题的例子是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nums = [1,2,2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果直接照搬 &lt;code&gt;78. 子集&lt;/code&gt; 的模板，搜索树里会出现两条不同分支：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;选择下标 1 的 2 -&amp;gt; [2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;选择下标 2 的 2 -&amp;gt; [2]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这两个分支路径不同，但值序列相同，最终答案重复。&lt;/p&gt;
&lt;p&gt;所以这题真正新增的问题不是“会不会回溯”，而是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;怎样跳过重复分支，同时保留 &lt;code&gt;[2,2]&lt;/code&gt; 这种合法答案？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="step-1先复用-78-的状态看看哪里会坏"&gt;Step 1：先复用 78 的状态，看看哪里会坏&lt;/h2&gt;
&lt;p&gt;当前部分答案仍然需要 &lt;code&gt;path&lt;/code&gt;；当前层仍然需要 &lt;code&gt;start&lt;/code&gt; 控制只能往右选。&lt;/p&gt;
&lt;p&gt;先写出 78 的核心版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dfs&lt;/span&gt;(start: int) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; res&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;copy())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(start, len(nums)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(nums[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dfs(i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pop()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个版本在 &lt;code&gt;nums&lt;/code&gt; 全部互不相同时是正确的。&lt;/p&gt;</description></item><item><title>Hot100：从前序与中序遍历序列构造二叉树（Construct Binary Tree from Preorder and Inorder Traversal）索引分治 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/105-construct-binary-tree-from-preorder-and-inorder-traversal/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/105-construct-binary-tree-from-preorder-and-inorder-traversal/</guid><description>围绕 LeetCode 105 讲清前序负责定根、中序负责切左右的分工，以及如何用索引区间和哈希表把构树复杂度降到 O(n)。</description></item><item><title>Hot100：二叉树的右视图（Binary Tree Right Side View）层序遍历取每层最后一个 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/199-binary-tree-right-side-view/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/199-binary-tree-right-side-view/</guid><description>围绕 LeetCode 199 讲清为什么右视图等价于“每层最后一个节点”，以及按层 BFS 和右优先 DFS 两种稳定写法。</description></item><item><title>Hot100：二叉树展开为链表（Flatten Binary Tree to Linked List）反向先序重连 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/114-flatten-binary-tree-to-linked-list/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/114-flatten-binary-tree-to-linked-list/</guid><description>围绕 LeetCode 114 讲清为什么展开后的链表顺序就是先序遍历，以及如何用反向先序和 prev 指针把整棵树原地重连。</description></item><item><title>Hot100：二叉树中的最大路径和（Binary Tree Maximum Path Sum）树形 DP / 单边贡献 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/124-binary-tree-maximum-path-sum/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/124-binary-tree-maximum-path-sum/</guid><description>围绕 LeetCode 124 讲清最大路径和的关键设计：递归向上只返回单边贡献，而经过当前节点的完整路径用来更新全局答案。</description></item><item><title>Hot100：二叉搜索树中第 K 小的元素（Kth Smallest Element in a BST）中序计数 / 提前停止 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/230-kth-smallest-element-in-a-bst/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/230-kth-smallest-element-in-a-bst/</guid><description>围绕 LeetCode 230 讲清为什么 BST 的中序遍历天然有序，以及如何用显式栈做到边遍历边计数、命中第 k 个就提前停止。</description></item><item><title>Hot100：将有序数组转换为二叉搜索树（Convert Sorted Array to Binary Search Tree）分治选中点 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/108-convert-sorted-array-to-binary-search-tree/</link><pubDate>Mon, 20 Apr 2026 09:37:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/108-convert-sorted-array-to-binary-search-tree/</guid><description>围绕 LeetCode 108 讲清为什么每次选中点就能同时满足 BST 有序性和平衡性，以及索引分治写法为什么最稳定。</description></item><item><title>Hot100：二叉树的直径（Diameter of Binary Tree）树形 DP / 高度回传 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/543-diameter-of-binary-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/543-diameter-of-binary-tree/</guid><description>围绕 LeetCode 543 讲清二叉树直径的核心：递归返回高度、在当前节点更新全局直径，以及为什么最长路径不一定只看根到叶。</description></item><item><title>Hot100：二叉树的最近公共祖先（Lowest Common Ancestor of a Binary Tree）后序返回值语义 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/236-lowest-common-ancestor-of-a-binary-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/236-lowest-common-ancestor-of-a-binary-tree/</guid><description>围绕 LeetCode 236 讲清最近公共祖先的后序返回值语义：子树返回什么、什么时候当前节点成为答案、以及为什么节点自己也可以是祖先。</description></item><item><title>Hot100：验证二叉搜索树（Validate Binary Search Tree）区间约束 / 中序判序 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/98-validate-binary-search-tree/</link><pubDate>Sun, 19 Apr 2026 14:52:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/98-validate-binary-search-tree/</guid><description>围绕 LeetCode 98 讲清 BST 的祖先区间约束、不只和父节点比较的核心原因，以及区间递归与中序判序两种稳定写法。</description></item><item><title>Hot100：N 皇后严格增量构建教程</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/51-n-queens/</link><pubDate>Sun, 19 Apr 2026 00:09:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/51-n-queens/</guid><description>用严格增量构建的方式讲解 LeetCode 51 N 皇后：从最小例子、最小 DFS 骨架，到第一版正确解，再到列与对角线状态优化。</description></item><item><title>Hot100：分割回文串（Palindrome Partitioning）回溯 + 回文预处理 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/131-palindrome-partitioning/</link><pubDate>Sun, 19 Apr 2026 00:09:28 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/131-palindrome-partitioning/</guid><description>围绕 LeetCode 131 分割回文串，讲清“切分枚举 + 回文区间预处理”的完整推导过程，帮助你把字符串分割型回溯真正写稳。</description></item><item><title>Hot100：电话号码的字母组合（Letter Combinations of a Phone Number）固定层数 DFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/17-letter-combinations-of-a-phone-number/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/17-letter-combinations-of-a-phone-number/</guid><description>围绕 LeetCode 17 讲清固定层数 DFS、数字到字母映射与多语言实现。</description></item><item><title>Hot100：全排列（Permutations）used[] 状态回溯模板 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/46-permutations/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/46-permutations/</guid><description>围绕 LeetCode 46 全排列，讲清 used[] 状态控制、叶子收集答案与多语言实现。</description></item><item><title>Hot100：组合总和（回溯 / 剪枝 / 可重复选取）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/39-combination-sum/</link><pubDate>Thu, 02 Apr 2026 13:48:57 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/backtracking/39-combination-sum/</guid><description>围绕 LeetCode 39 讲清组合型回溯、可重复选取、remain 状态与排序剪枝，并用一步一步构建代码的方式把模板真正学会。</description></item><item><title>Hot100：二叉树的层序遍历（Binary Tree Level Order Traversal）BFS / DFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/102-binary-tree-level-order-traversal/</link><pubDate>Sun, 15 Mar 2026 21:29:44 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/102-binary-tree-level-order-traversal/</guid><description>讲透 LeetCode 102 的按层 BFS、层宽控制与 DFS depth bucket 备选方案，附工程迁移和多语言实现。</description></item><item><title>Hot100：对称二叉树（Symmetric Tree）镜像递归 / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/101-symmetric-tree/</link><pubDate>Sun, 15 Mar 2026 21:29:43 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/101-symmetric-tree/</guid><description>围绕 LeetCode 101 讲清镜像递归、BFS 成对入队与树形结构对称校验，附工程迁移和多语言实现。</description></item><item><title>Hot100：翻转二叉树（Invert Binary Tree）递归 / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/226-invert-binary-tree/</link><pubDate>Fri, 06 Mar 2026 17:58:23 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/226-invert-binary-tree/</guid><description>围绕 LeetCode 226 讲清树镜像变换、递归交换左右子树的本质，以及工程里的结构镜像场景。</description></item><item><title>Hot100：二叉树的最大深度（Maximum Depth of Binary Tree）DFS / BFS ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/104-maximum-depth-of-binary-tree/</link><pubDate>Fri, 06 Mar 2026 17:58:22 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/104-maximum-depth-of-binary-tree/</guid><description>讲透 LeetCode 104 的深度定义、递归 DFS 与层序 BFS 两种主流解法，附工程迁移和多语言实现。</description></item><item><title>Hot100：二叉树的中序遍历（Binary Tree Inorder Traversal）递归 / 显式栈 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/94-binary-tree-inorder-traversal/</link><pubDate>Fri, 06 Mar 2026 17:58:21 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/94-binary-tree-inorder-traversal/</guid><description>用左-根-右模板讲透 LeetCode 94，覆盖递归、显式栈与工程迁移场景，附多语言可运行实现。</description></item><item><title>Hot100：排序链表（Sort List）链表归并排序 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/148-sort-list/</link><pubDate>Tue, 10 Feb 2026 17:07:38 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/148-sort-list/</guid><description>在 O(n log n) 时间内对单链表排序。本文用“快慢指针找中点 + 分治归并”给出稳定模板，并对比数组化方案、常见坑和多语言实现。</description></item><item><title>Hot100：合并K个升序链表（Merge k Sorted Lists）分治归并 O(N log k) ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/23-merge-k-sorted-lists/</link><pubDate>Tue, 10 Feb 2026 17:05:53 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/23-merge-k-sorted-lists/</guid><description>把 LeetCode 21 的双链表归并扩展到 k 路：从朴素串行合并到分治归并，时间复杂度降到 O(N log k)，并对比最小堆方案与工程取舍，附多语言实现。</description></item><item><title>Hot100：K 个一组翻转链表（Reverse Nodes in k-Group）分组反转 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/25-reverse-nodes-in-k-group/</link><pubDate>Tue, 10 Feb 2026 10:01:23 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/25-reverse-nodes-in-k-group/</guid><description>在单链表中每 k 个节点为一组进行原地反转，不足 k 的尾组保持不变。本文给出哑节点 + 分组扫描 + 原地反转模板，时间 O(n)、额外空间 O(1)，附多语言实现。</description></item><item><title>Hot100：路径和 III 前缀和 + 哈希表统计向下路径（LeetCode 437）ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/437-path-sum-iii/</link><pubDate>Mon, 02 Feb 2026 22:13:45 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/binary-tree/437-path-sum-iii/</guid><description>用前缀和 + 计数哈希表在 O(n) 时间统计二叉树中和为 targetSum 的向下路径数，含推导、工程迁移与多语言实现。</description></item><item><title>Hot100：环形链表 II（Linked List Cycle II）Floyd 判环 + 定位入环点 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/142-linked-list-cycle-ii/</link><pubDate>Sun, 01 Feb 2026 21:40:21 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/142-linked-list-cycle-ii/</guid><description>不修改链表的前提下返回入环的第一个节点：Floyd 快慢指针先相遇判环，再从头与相遇点同步前进定位入环点；O(n) 时间、O(1) 额外空间。</description></item><item><title>Hot100：合并两个有序链表（Merge Two Sorted Lists）哨兵节点归并 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/21-merge-two-sorted-lists/</link><pubDate>Sun, 01 Feb 2026 21:40:06 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/21-merge-two-sorted-lists/</guid><description>用哨兵节点 + 双指针在 O(m+n) 时间把两个升序链表“拼接式”合并为一个升序链表，并对比递归写法与常见坑，附多语言可运行实现（Hot100）。</description></item><item><title>Hot100：环形链表（Linked List Cycle）Floyd 快慢指针 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/141-linked-list-cycle/</link><pubDate>Sun, 01 Feb 2026 18:45:44 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/141-linked-list-cycle/</guid><description>用 Floyd 快慢指针在 O(n) 时间、O(1) 额外空间判断单链表是否有环，并对比哈希表方案、常见坑与工程迁移，附多语言可运行实现（Hot100）。</description></item><item><title>Hot100：回文链表（Palindrome Linked List）快慢指针 + 反转后半段 O(1) 空间 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/234-palindrome-linked-list/</link><pubDate>Sun, 01 Feb 2026 18:44:01 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/234-palindrome-linked-list/</guid><description>判断单链表是否为回文：快慢指针定位中点、原地反转后半段并与前半段对比，最后再恢复链表；O(n) 时间、O(1) 额外空间。</description></item><item><title>Hot100：反转链表（Reverse Linked List）三指针迭代/递归 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/206-reverse-linked-list/</link><pubDate>Sun, 01 Feb 2026 16:30:26 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/206-reverse-linked-list/</guid><description>用三指针迭代在 O(n) 时间、O(1) 额外空间反转单链表，并对比递归写法与常见坑，附多语言可运行实现（Hot100）。</description></item><item><title>Hot100：相交链表（Intersection of Two Linked Lists）双指针换头 O(1) 空间 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/160-intersection-of-two-linked-lists/</link><pubDate>Sun, 01 Feb 2026 16:29:40 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/linked-list/160-intersection-of-two-linked-lists/</guid><description>在不破坏链表结构的前提下找到两个单链表的相交起点：双指针“走完 A 再走 B”保证同步，O(m+n) 时间、O(1) 额外空间；含推导、工程迁移与多语言实现。</description></item><item><title>Hot100：搜索二维矩阵 II（Search a 2D Matrix II）右上角阶梯搜索 O(m+n) ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/240-search-a-2d-matrix-ii/</link><pubDate>Sun, 01 Feb 2026 13:56:55 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/240-search-a-2d-matrix-ii/</guid><description>行列均升序的矩阵查找 target：从右上角出发每步排除一行或一列，O(m+n) 时间、O(1) 空间；含推导、工程迁移与多语言实现。</description></item><item><title>Hot100：螺旋矩阵（Spiral Matrix）边界收缩模拟 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/54-spiral-matrix/</link><pubDate>Sun, 01 Feb 2026 13:55:22 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/54-spiral-matrix/</guid><description>用“边界收缩”在 O(mn) 时间输出矩阵的顺时针螺旋序列，附工程场景、易错点与多语言实现（Hot100）。</description></item><item><title>Hot100：旋转图像（Rotate Image）转置 + 行反转实现原地 90 度旋转 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/48-rotate-image/</link><pubDate>Sun, 01 Feb 2026 13:51:51 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/48-rotate-image/</guid><description>顺时针旋转 n×n 矩阵 90 度：用“先转置、再反转每一行”在 O(n^2) 时间、O(1) 额外空间原地完成；含推导、工程场景与多语言实现。</description></item><item><title>矩阵置零：用首行首列做标记实现原地 O(1) 空间（LeetCode 73）</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/73-set-matrix-zeroes/</link><pubDate>Sun, 01 Feb 2026 12:53:35 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/73-set-matrix-zeroes/</guid><description>把首行首列当作标记位，在不额外开集合的前提下原地完成矩阵置零；含思路推导、常见坑与多语言实现。</description></item><item><title>Hot100：缺失的第一个正数（First Missing Positive）原地索引定位 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/41-first-missing-positive/</link><pubDate>Sat, 24 Jan 2026 12:42:31 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/41-first-missing-positive/</guid><description>用原地索引定位在 O(n) 时间、O(1) 额外空间找到缺失的第一个正数，含工程场景与多语言实现。</description></item><item><title>Hot100：除自身以外数组的乘积（Product of Array Except Self）前后缀乘积 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/238-product-of-array-except-self/</link><pubDate>Sat, 24 Jan 2026 12:35:09 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/238-product-of-array-except-self/</guid><description>O(n) 时间、无需除法，用前后缀乘积求解除自身以外数组的乘积，含工程场景与多语言实现。</description></item><item><title>Hot100：轮转数组（Rotate Array）三次反转 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/189-rotate-array/</link><pubDate>Sat, 24 Jan 2026 12:29:42 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/189-rotate-array/</guid><description>用三次反转在 O(n) 时间完成轮转数组，含工程场景、常见误区与多语言实现。</description></item><item><title>Hot100：合并区间（Merge Intervals）排序扫描 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/56-merge-intervals/</link><pubDate>Sat, 24 Jan 2026 11:21:03 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/56-merge-intervals/</guid><description>围绕合并区间（LeetCode 56）讲清排序+线性扫描的核心思路、工程场景与多语言实现。</description></item><item><title>LeetCode 42：一张高度图能接住多少雨水？</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/42-trapping-rain-water/</link><pubDate>Sat, 24 Jan 2026 10:27:35 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/42-trapping-rain-water/</guid><description>从单个位置出发，推导边界数组和 O(1) 空间的双指针解法，再把同一个边界模型迁移到单调栈。</description></item><item><title>Hot100：和为 K 的子数组（Subarray Sum Equals K）前缀和 + 哈希表 ACERS 解析</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/560-subarray-sum-equals-k/</link><pubDate>Sat, 17 Jan 2026 20:49:25 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/560-subarray-sum-equals-k/</guid><description>用前缀和与哈希表在 O(n) 时间统计和为 K 的子数组数量，含工程场景、多语言实现与常见误区。</description></item><item><title>Hot100：Two Sum 两数之和哈希表一遍扫描与 ACERS 工程化解析（LeetCode 1）</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/1-two-sum/</link><pubDate>Sun, 28 Dec 2025 10:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/1-two-sum/</guid><description>从题意还原到哈希表一遍扫描，系统讲解 Two Sum，并给出工程场景、复杂度对比与多语言实现。</description></item><item><title>Hot100：Search Insert Position 排序数组中目标值插入位置的二分查找实战（LeetCode 35）</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/35-search-insert-position/</link><pubDate>Thu, 04 Dec 2025 11:10:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/35-search-insert-position/</guid><description>在有序数组中寻找目标值插入位置，使数组仍然有序：存在返回下标，不存在返回应插入的位置。本文用统一的 lower_bound 二分模板实现 Search Insert Position，并给出多语言代码与工程应用示例。</description></item><item><title>LeetCode 34：在排序数组中查找元素的第一个和最后一个位置</title><link>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/34-find-first-and-last-position-of-element-in-sorted-array/</link><pubDate>Thu, 04 Dec 2025 11:00:00 +0800</pubDate><guid>https://jeanphilogong.github.io/jeanblog/zh/alg/leetcode/hot100/34-find-first-and-last-position-of-element-in-sorted-array/</guid><description>从线性扫描基线出发，推导两个半开区间二分边界，在 O(log n) 时间内返回目标值的完整范围。</description></item></channel></rss>