<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>kukudely's Space</title><link>https://kukudely.cloud/</link><description>Recent content on kukudely's Space</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 06 Sep 2026 16:07:58 +0800</lastBuildDate><atom:link href="https://kukudely.cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode 3：无重复字符的最长子串</title><link>https://kukudely.cloud/posts/longest-substring-without-repeating-characters/</link><pubDate>Sun, 06 Sep 2026 16:07:58 +0800</pubDate><guid>https://kukudely.cloud/posts/longest-substring-without-repeating-characters/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/longest-substring-without-repeating-characters/"&gt;LeetCode 3：无重复字符的最长子串&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：中等&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一个字符串 &lt;code&gt;s&lt;/code&gt;，找出其中不包含重复字符的最长连续子串，并返回它的长度。&lt;/p&gt;
&lt;h3 id="示例-1"&gt;示例 1&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;abcabcbb&amp;#34;
&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;解释：&amp;#34;abc&amp;#34;、&amp;#34;bca&amp;#34; 和 &amp;#34;cab&amp;#34; 都是长度为 3 的无重复字符子串。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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;bbbbb&amp;#34;
&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;h3 id="示例-3"&gt;示例 3&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;pwwkew&amp;#34;
&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;解释：最长无重复字符子串之一是 &amp;#34;wke&amp;#34;。子串要求字符在原字符串中连续。
&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;0 &amp;lt;= s.length &amp;lt;= 10^5&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; 由英文字母、数字、符号和空格组成。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="题解"&gt;题解&lt;/h2&gt;
&lt;h3 id="思路滑动窗口与哈希表"&gt;思路：滑动窗口与哈希表&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;[start, end]&lt;/code&gt; 表示当前窗口，并保证窗口内的字符互不重复。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;end&lt;/code&gt; 逐个扫描字符串，加入新的字符。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt; 记录窗口的左边界，只向右移动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mp&lt;/code&gt; 记录每个字符最近一次出现的下标加一。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ans&lt;/code&gt; 记录遍历过程中发现的最大窗口长度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;遇到字符 &lt;code&gt;alpha := s[end]&lt;/code&gt; 时，如果它曾经出现过，取出 &lt;code&gt;v := mp[alpha]&lt;/code&gt;。当 &lt;code&gt;v &amp;gt; start&lt;/code&gt; 时，说明上次出现的位置仍在当前窗口内，将 &lt;code&gt;start&lt;/code&gt; 移动到 &lt;code&gt;v&lt;/code&gt;，就能排除旧字符。&lt;/p&gt;
&lt;p&gt;随后用 &lt;code&gt;end - start + 1&lt;/code&gt; 更新答案，并将 &lt;code&gt;mp[alpha]&lt;/code&gt; 更新为 &lt;code&gt;end + 1&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>LeetCode 42：接雨水</title><link>https://kukudely.cloud/posts/trapping-rain-water/</link><pubDate>Sun, 06 Sep 2026 14:33:16 +0800</pubDate><guid>https://kukudely.cloud/posts/trapping-rain-water/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/trapping-rain-water/?envType=study-plan-v2&amp;amp;envId=top-100-liked"&gt;LeetCode 42：接雨水&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：困难&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定 &lt;code&gt;n&lt;/code&gt; 个非负整数表示每个宽度为 &lt;code&gt;1&lt;/code&gt; 的柱子的高度图，计算下雨之后能够接住的雨水总量。&lt;/p&gt;
&lt;h3 id="示例-1"&gt;示例 1&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;输入：height = [0,1,0,2,1,0,1,3,2,1,2,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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;输入：height = [4,2,0,3,2,5]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="核心思路"&gt;核心思路&lt;/h2&gt;
&lt;p&gt;对于位置 &lt;code&gt;i&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;water[i] = min(leftMax[i], rightMax[i]) - height[i]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数组两端缺少一侧边界，无法接住雨水。只需计算中间位置的积水量，再将它们累加起来。&lt;/p&gt;
&lt;h2 id="题解一动态规划"&gt;题解一：动态规划&lt;/h2&gt;
&lt;h3 id="思路"&gt;思路&lt;/h3&gt;
&lt;p&gt;创建两个长度为 &lt;code&gt;n&lt;/code&gt; 的数组：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;leftMax[i]&lt;/code&gt; 表示从下标 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;i&lt;/code&gt; 的最大高度。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rightMax[i]&lt;/code&gt; 表示从下标 &lt;code&gt;i&lt;/code&gt; 到 &lt;code&gt;n-1&lt;/code&gt; 的最大高度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先从左向右计算 &lt;code&gt;leftMax&lt;/code&gt;，再从右向左计算 &lt;code&gt;rightMax&lt;/code&gt;。得到两侧最高柱后，可以直接计算每个位置的积水量。&lt;/p&gt;
&lt;p&gt;以位置 &lt;code&gt;i&lt;/code&gt; 为例，水面高度受到左右两侧较矮边界的限制，因此水面高度为 &lt;code&gt;min(leftMax[i], rightMax[i])&lt;/code&gt;。减去当前位置的柱高，就是该位置能够接住的雨水量。&lt;/p&gt;
&lt;h3 id="正确性说明"&gt;正确性说明&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;leftMax[i]&lt;/code&gt; 和 &lt;code&gt;rightMax[i]&lt;/code&gt; 分别记录位置 &lt;code&gt;i&lt;/code&gt; 两侧能够形成边界的最高柱。水无法越过较矮的一侧，所以位置 &lt;code&gt;i&lt;/code&gt; 的最高水面由两者的较小值确定。&lt;/p&gt;
&lt;p&gt;每个位置的计算结果都准确表示该列上方的积水量。累加所有位置后，即可得到总雨水量。&lt;/p&gt;
&lt;h3 id="复杂度分析"&gt;复杂度分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;时间复杂度：&lt;code&gt;O(n)&lt;/code&gt;。需要三次线性遍历。&lt;/li&gt;
&lt;li&gt;空间复杂度：&lt;code&gt;O(n)&lt;/code&gt;。两个辅助数组各保存 &lt;code&gt;n&lt;/code&gt; 个元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="go-代码"&gt;Go 代码&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-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;trapDP&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; len(&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;leftMax&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rightMax&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;)
&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:#a6e22e"&gt;leftMax&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&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; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &amp;lt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;leftMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] = max(&lt;span style="color:#a6e22e"&gt;leftMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;])
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rightMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;&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;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;--&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;rightMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] = max(&lt;span style="color:#a6e22e"&gt;rightMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;])
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&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; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &amp;lt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; min(&lt;span style="color:#a6e22e"&gt;leftMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;rightMax&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ans&lt;/span&gt;
&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;h2 id="题解二双指针"&gt;题解二：双指针&lt;/h2&gt;
&lt;h3 id="思路-1"&gt;思路&lt;/h3&gt;
&lt;p&gt;动态规划保存了每个位置的左右最大高度。继续观察可以发现，计算当前积水量时只需要已经遍历过的 &lt;code&gt;leftMax&lt;/code&gt; 和 &lt;code&gt;rightMax&lt;/code&gt;，因此可以使用双指针压缩空间。&lt;/p&gt;</description></item><item><title>LeetCode 15：三数之和</title><link>https://kukudely.cloud/posts/3sum/</link><pubDate>Mon, 31 Aug 2026 22:17:38 +0800</pubDate><guid>https://kukudely.cloud/posts/3sum/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/3sum/?envType=study-plan-v2&amp;amp;envId=top-100-liked"&gt;LeetCode 15：三数之和&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：中等&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一个整数数组 &lt;code&gt;nums&lt;/code&gt;，找出所有满足以下条件的三元组：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三个元素来自不同的数组下标。&lt;/li&gt;
&lt;li&gt;三个元素之和等于 &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;答案中不能包含重复的三元组。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例-1"&gt;示例 1&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,0,1,2,-1,-4]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[[-1,-1,2],[-1,0,1]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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 = [0,1,1]
&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="示例-3"&gt;示例 3&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 = [0,0,0]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[[0,0,0]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="题解"&gt;题解&lt;/h2&gt;
&lt;h3 id="思路排序与双指针"&gt;思路：排序与双指针&lt;/h3&gt;
&lt;p&gt;先对数组进行升序排序。排序后固定第一个数 &lt;code&gt;nums[i]&lt;/code&gt;，再使用左右指针在区间 &lt;code&gt;[i+1, n-1]&lt;/code&gt; 中寻找另外两个数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;left&lt;/code&gt; 指向固定值右侧的第一个候选位置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;right&lt;/code&gt; 指向数组末尾。&lt;/li&gt;
&lt;li&gt;三数之和小于 &lt;code&gt;0&lt;/code&gt; 时，移动 &lt;code&gt;left&lt;/code&gt; 可以让和增大。&lt;/li&gt;
&lt;li&gt;三数之和大于 &lt;code&gt;0&lt;/code&gt; 时，移动 &lt;code&gt;right&lt;/code&gt; 可以让和减小。&lt;/li&gt;
&lt;li&gt;三数之和等于 &lt;code&gt;0&lt;/code&gt; 时，记录结果，并移动两个指针继续查找。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数组有序后，当 &lt;code&gt;nums[i] &amp;gt; 0&lt;/code&gt; 时，当前值及其右侧元素都大于 &lt;code&gt;0&lt;/code&gt;，已经无法组成和为 &lt;code&gt;0&lt;/code&gt; 的三元组，可以提前结束遍历。&lt;/p&gt;
&lt;h3 id="去重"&gt;去重&lt;/h3&gt;
&lt;p&gt;题目要求结果中不能出现重复三元组，因此需要在三个位置上处理重复值：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;固定第一个数时，如果 &lt;code&gt;nums[i] == nums[i-1]&lt;/code&gt;，跳过当前值。&lt;/li&gt;
&lt;li&gt;找到一个答案后，移动 &lt;code&gt;left&lt;/code&gt;，并跳过与前一个左侧值相同的元素。&lt;/li&gt;
&lt;li&gt;同时移动 &lt;code&gt;right&lt;/code&gt;，并跳过与前一个右侧值相同的元素。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如排序后的数组为 &lt;code&gt;[-4,-1,-1,0,1,2]&lt;/code&gt;。第一个 &lt;code&gt;-1&lt;/code&gt; 已经完成搜索后，第二个 &lt;code&gt;-1&lt;/code&gt; 无需再次作为固定值，从而避免生成相同的三元组。&lt;/p&gt;</description></item><item><title>LeetCode 11：盛最多水的容器</title><link>https://kukudely.cloud/posts/container-with-most-water/</link><pubDate>Mon, 31 Aug 2026 10:11:25 +0800</pubDate><guid>https://kukudely.cloud/posts/container-with-most-water/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&amp;amp;envId=top-100-liked"&gt;LeetCode 11：盛最多水的容器&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：中等&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一个长度为 &lt;code&gt;n&lt;/code&gt; 的整数数组 &lt;code&gt;height&lt;/code&gt;。数组中的第 &lt;code&gt;i&lt;/code&gt; 个元素表示一条垂线的高度，这条垂线的两个端点分别是 &lt;code&gt;(i, 0)&lt;/code&gt; 和 &lt;code&gt;(i, height[i])&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;从中选择两条垂线，使它们与 &lt;code&gt;x&lt;/code&gt; 轴共同构成一个容器，返回该容器可以储存的最大水量。容器不能倾斜。&lt;/p&gt;
&lt;h3 id="示例-1"&gt;示例 1&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;输入：height = [1,8,6,2,5,4,8,3,7]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：49
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;解释：选择下标 1 和 8 对应的两条垂线，高度分别为 8 和 7。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 容器宽度为 8 - 1 = 7，有效高度为 min(8, 7) = 7，
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 因此水量为 7 × 7 = 49。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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;输入：height = [1,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;h2 id="题解"&gt;题解&lt;/h2&gt;
&lt;h3 id="面积如何计算"&gt;面积如何计算&lt;/h3&gt;
&lt;p&gt;选择下标 &lt;code&gt;left&lt;/code&gt; 和 &lt;code&gt;right&lt;/code&gt; 处的两条垂线后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;容器宽度为 &lt;code&gt;right - left&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;水面高度由较短的垂线决定，即 &lt;code&gt;min(height[left], height[right])&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此当前容器的水量为：&lt;/p&gt;</description></item><item><title>LeetCode 283：移动零</title><link>https://kukudely.cloud/posts/move-zeroes/</link><pubDate>Sun, 30 Aug 2026 21:33:26 +0800</pubDate><guid>https://kukudely.cloud/posts/move-zeroes/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&amp;amp;envId=top-100-liked"&gt;LeetCode 283：移动零&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：简单&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一个数组 &lt;code&gt;nums&lt;/code&gt;，将所有 &lt;code&gt;0&lt;/code&gt; 移动到数组末尾，同时保持非零元素的相对顺序。&lt;/p&gt;
&lt;p&gt;要求在不复制数组的情况下原地完成操作。&lt;/p&gt;
&lt;h3 id="示例-1"&gt;示例 1&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 = [0,1,0,3,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[1,3,12,0,0]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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 = [0]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：[0]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="题解"&gt;题解&lt;/h2&gt;
&lt;h3 id="思路双指针"&gt;思路：双指针&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;left&lt;/code&gt; 和 &lt;code&gt;right&lt;/code&gt; 两个指针从左向右遍历数组：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;right&lt;/code&gt; 负责寻找非零元素。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;left&lt;/code&gt; 指向下一个非零元素应该放置的位置。&lt;/li&gt;
&lt;li&gt;当 &lt;code&gt;nums[right]&lt;/code&gt; 非零时，交换 &lt;code&gt;nums[left]&lt;/code&gt; 和 &lt;code&gt;nums[right]&lt;/code&gt;，然后将 &lt;code&gt;left&lt;/code&gt; 向右移动一位。&lt;/li&gt;
&lt;li&gt;每轮遍历结束后，将 &lt;code&gt;right&lt;/code&gt; 向右移动一位。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;遍历过程中，&lt;code&gt;[0, left)&lt;/code&gt; 始终保存已经处理过的非零元素，并保持它们在原数组中的相对顺序。区间 &lt;code&gt;[left, right)&lt;/code&gt; 保存已经遇到的零。发现新的非零元素时，通过交换把它放到 &lt;code&gt;left&lt;/code&gt; 指向的位置，同时把零移到后面。&lt;/p&gt;
&lt;p&gt;以 &lt;code&gt;[0,1,0,3,12]&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;初始： [0,1,0,3,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;处理 1 后： [1,0,0,3,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;处理 3 后： [1,3,0,0,12]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;处理 12 后： [1,3,12,0,0]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="正确性说明"&gt;正确性说明&lt;/h3&gt;
&lt;p&gt;每次处理非零元素时，算法都会把它放到当前最靠左的可用位置。非零元素按照从左到右的顺序依次被处理，因此相对顺序保持不变。&lt;/p&gt;</description></item><item><title>LeetCode 128：最长连续序列</title><link>https://kukudely.cloud/posts/longest-consecutive-sequence/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0800</pubDate><guid>https://kukudely.cloud/posts/longest-consecutive-sequence/</guid><description>&lt;h2 id="题目描述"&gt;题目描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&amp;amp;envId=top-100-like"&gt;LeetCode 128：最长连续序列&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难度：中等&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定一个未排序的整数数组 &lt;code&gt;nums&lt;/code&gt;，找出数字连续的最长序列的长度。序列中的元素不要求在原数组中连续。&lt;/p&gt;
&lt;p&gt;要求设计并实现时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt; 的算法。&lt;/p&gt;
&lt;h3 id="示例-1"&gt;示例 1&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 = [100,4,200,1,3,2]
&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;解释：最长连续序列是 [1,2,3,4]，长度为 4。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-2"&gt;示例 2&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 = [0,3,7,2,5,8,4,6,0,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出：9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例-3"&gt;示例 3&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,0,1,2]
&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;h2 id="题解"&gt;题解&lt;/h2&gt;
&lt;h3 id="思路哈希集合"&gt;思路：哈希集合&lt;/h3&gt;
&lt;p&gt;先把数组中的所有数字放入哈希集合。这样既能去重，也能在平均 &lt;code&gt;O(1)&lt;/code&gt; 时间内判断某个数字是否存在。&lt;/p&gt;
&lt;p&gt;遍历集合中的每个数字 &lt;code&gt;num&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果 &lt;code&gt;num - 1&lt;/code&gt; 也在集合中，说明 &lt;code&gt;num&lt;/code&gt; 已有前驱，直接跳过。&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;num - 1&lt;/code&gt; 不在集合中，说明 &lt;code&gt;num&lt;/code&gt; 是一段连续序列的起点。&lt;/li&gt;
&lt;li&gt;从 &lt;code&gt;num&lt;/code&gt; 开始不断检查 &lt;code&gt;num + 1&lt;/code&gt;、&lt;code&gt;num + 2&lt;/code&gt;……是否存在，统计当前连续序列的长度。&lt;/li&gt;
&lt;li&gt;用当前长度更新最长长度。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键点是：&lt;strong&gt;只从连续序列的起点向后查找。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如集合中有 &lt;code&gt;1、2、3、4&lt;/code&gt;。遍历到 &lt;code&gt;2、3、4&lt;/code&gt; 时，因为它们都有前驱，所以不会重复向后查找；只有 &lt;code&gt;1&lt;/code&gt; 会完整扫描这段序列。&lt;/p&gt;
&lt;h3 id="正确性说明"&gt;正确性说明&lt;/h3&gt;
&lt;p&gt;任意一段连续序列都有且只有一个最小值。这个最小值的前一个数字一定不在集合中，因此算法一定会把它识别为序列起点，并从该起点找到整段连续序列。&lt;/p&gt;
&lt;p&gt;其他数字因为存在前驱，不会被当作起点，所以不会重复统计同一段序列。遍历所有起点并取最大长度，得到的就是最长连续序列的长度。&lt;/p&gt;</description></item><item><title>About</title><link>https://kukudely.cloud/about/</link><pubDate>Sun, 24 May 2026 00:00:00 +0800</pubDate><guid>https://kukudely.cloud/about/</guid><description>&lt;p&gt;Hey, I&amp;rsquo;m kukudely. Welcome to my space.&lt;/p&gt;
&lt;p&gt;This is where I write about things I&amp;rsquo;m learning, building, and thinking about.&lt;/p&gt;</description></item><item><title>Hello World</title><link>https://kukudely.cloud/posts/hello-world/</link><pubDate>Sat, 23 May 2026 20:26:20 +0800</pubDate><guid>https://kukudely.cloud/posts/hello-world/</guid><description/></item></channel></rss>