<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Jiaru</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://jiarus.github.io/</id>
  <link href="https://jiarus.github.io/" rel="alternate"/>
  <link href="https://jiarus.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Jiaru</rights>
  <subtitle>
    <![CDATA[Java Backend & Ad Tech]]>
  </subtitle>
  <title>Jiaru's Tech Notes</title>
  <updated>2026-03-03T08:25:52.208Z</updated>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="IELTS" scheme="https://jiarus.github.io/categories/IELTS/"/>
    <category term="IELTS" scheme="https://jiarus.github.io/tags/IELTS/"/>
    <category term="单词" scheme="https://jiarus.github.io/tags/%E5%8D%95%E8%AF%8D/"/>
    <category term="笔记" scheme="https://jiarus.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>📚 5月单词、短语、句型积累</p><hr><h2 id="Week-1"><a href="#Week-1" class="headerlink" title="Week 1"></a>Week 1</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语"><a href="#短语" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-2"><a href="#Week-2" class="headerlink" title="Week 2"></a>Week 2</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-1"><a href="#短语-1" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-3"><a href="#Week-3" class="headerlink" title="Week 3"></a>Week 3</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-2"><a href="#短语-2" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-4"><a href="#Week-4" class="headerlink" title="Week 4"></a>Week 4</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-3"><a href="#短语-3" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="📊-本月统计"><a href="#📊-本月统计" class="headerlink" title="📊 本月统计"></a>📊 本月统计</h2><table><thead><tr><th align="center">周次</th><th align="center">单词</th><th align="center">短语</th><th align="center">句型</th></tr></thead><tbody><tr><td align="center">Week 1</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 2</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 3</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 4</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center"><strong>合计</strong></td><td align="center"></td><td align="center"></td><td align="center"></td></tr></tbody></table>]]>
    </content>
    <id>https://jiarus.github.io/2026/05/01/IELTS-2026-05-ielts-vocabulary/</id>
    <link href="https://jiarus.github.io/2026/05/01/IELTS-2026-05-ielts-vocabulary/"/>
    <published>2026-05-01T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>📚 5月单词、短语、句型积累</p>
<hr>
<h2 id="Week-1"><a href="#Week-1" class="headerlink" title="Week 1"></a>Week 1</h2><p><strong>单词</strong></p>
<table>
<thead>
<tr>
<th align="left">单词</th>
<th align="center">词性</th>
<th align="left">释义</th>
<th align="left">例句</th>
</tr>
</thead>
<tbody><tr>
<td align="left"></td>
<td align="center"></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>]]>
    </summary>
    <title>IELTS 备考笔记 | 5月</title>
    <updated>2026-03-03T08:25:52.208Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="IELTS" scheme="https://jiarus.github.io/categories/IELTS/"/>
    <category term="IELTS" scheme="https://jiarus.github.io/tags/IELTS/"/>
    <category term="单词" scheme="https://jiarus.github.io/tags/%E5%8D%95%E8%AF%8D/"/>
    <category term="笔记" scheme="https://jiarus.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>📚 4月单词、短语、句型积累</p><hr><h2 id="Week-1"><a href="#Week-1" class="headerlink" title="Week 1"></a>Week 1</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语"><a href="#短语" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-2"><a href="#Week-2" class="headerlink" title="Week 2"></a>Week 2</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-1"><a href="#短语-1" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-3"><a href="#Week-3" class="headerlink" title="Week 3"></a>Week 3</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-2"><a href="#短语-2" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="Week-4"><a href="#Week-4" class="headerlink" title="Week 4"></a>Week 4</h2><p><strong>单词</strong></p><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h2 id="短语-3"><a href="#短语-3" class="headerlink" title="短语"></a><strong>短语</strong></h2><p><strong>好句</strong></p><blockquote></blockquote><hr><h2 id="📊-本月统计"><a href="#📊-本月统计" class="headerlink" title="📊 本月统计"></a>📊 本月统计</h2><table><thead><tr><th align="center">周次</th><th align="center">单词</th><th align="center">短语</th><th align="center">句型</th></tr></thead><tbody><tr><td align="center">Week 1</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 2</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 3</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 4</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center"><strong>合计</strong></td><td align="center"></td><td align="center"></td><td align="center"></td></tr></tbody></table>]]>
    </content>
    <id>https://jiarus.github.io/2026/04/01/IELTS-2026-04-ielts-vocabulary/</id>
    <link href="https://jiarus.github.io/2026/04/01/IELTS-2026-04-ielts-vocabulary/"/>
    <published>2026-04-01T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>📚 4月单词、短语、句型积累</p>
<hr>
<h2 id="Week-1"><a href="#Week-1" class="headerlink" title="Week 1"></a>Week 1</h2><p><strong>单词</strong></p>
<table>
<thead>
<tr>
<th align="left">单词</th>
<th align="center">词性</th>
<th align="left">释义</th>
<th align="left">例句</th>
</tr>
</thead>
<tbody><tr>
<td align="left"></td>
<td align="center"></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>]]>
    </summary>
    <title>IELTS 备考笔记 | 4月</title>
    <updated>2026-03-03T08:25:52.229Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="LeetCode" scheme="https://jiarus.github.io/categories/LeetCode/"/>
    <category term="LeetCode" scheme="https://jiarus.github.io/tags/LeetCode/"/>
    <category term="Hot100" scheme="https://jiarus.github.io/tags/Hot100/"/>
    <content>
      <![CDATA[<blockquote><p>LeetCode Hot 100</p></blockquote><hr><h2 id="为什么要系统性检查边界条件"><a href="#为什么要系统性检查边界条件" class="headerlink" title="为什么要系统性检查边界条件"></a>为什么要系统性检查边界条件</h2><p>边界条件的本质是：输入规模、窗口范围、索引合法性是否被完整覆盖。常见问题来自：</p><ul><li>空输入 &#x2F; 空字符串</li><li>单元素 &#x2F; 最小窗口</li><li>窗口刚好满足条件</li><li>计数回退导致的 off-by-one</li><li>排序 &#x2F; 哈希 &#x2F; 计数数组的索引越界</li></ul><hr><h2 id="通用检查清单"><a href="#通用检查清单" class="headerlink" title="通用检查清单"></a>通用检查清单</h2><ul><li>长度关系：t.length() &gt; s.length() 直接返回</li><li>窗口初始化：k &#x3D;&#x3D; 1 或 k &#x3D;&#x3D; nums.length</li><li>索引范围：i - k + 1 不可为负</li><li>计数回退：移出窗口时先恢复计数，再判断是否满足</li><li>返回默认值：未更新最优解时返回空或初始化值</li></ul><hr><h2 id="典型题型要点"><a href="#典型题型要点" class="headerlink" title="典型题型要点"></a>典型题型要点</h2><p>比如 k是窗口大小，i 是当前索引，那么窗口的左边界是 i - k + 1，右边界是 i。<br>通过画图，i-k是去掉窗口大小后的索引，+1 是因为窗口是包含右边界的。</p><h3 id="滑动窗口"><a href="#滑动窗口" class="headerlink" title="滑动窗口"></a>滑动窗口</h3><ul><li>右指针推进后先更新计数，再判断是否满足</li><li>左指针收缩时先恢复计数，再判断是否失效</li><li>记录答案时注意区间长度 right - left + 1</li></ul><h3 id="前缀和-哈希"><a href="#前缀和-哈希" class="headerlink" title="前缀和 &#x2F; 哈希"></a>前缀和 &#x2F; 哈希</h3><ul><li>sum 从 0 开始，map 需要预置 0 -&gt; 1</li><li>防止重复计数：先查询，再更新</li></ul><h3 id="单调队列"><a href="#单调队列" class="headerlink" title="单调队列"></a>单调队列</h3><ul><li>过期元素判断：index &lt; i - k + 1</li><li>队列维护：入队前移除不可能成为最大值的元素</li></ul><hr><h2 id="示例：最小覆盖子串的边界"><a href="#示例：最小覆盖子串的边界" class="headerlink" title="示例：最小覆盖子串的边界"></a>示例：最小覆盖子串的边界</h2><ul><li>t 为空时，可直接返回空串</li><li>s 为空时，直接返回空串</li><li>required 计数必须与 need 更新顺序一致</li><li>最优答案初始化为 MAX，未更新则返回空串</li></ul><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>边界条件判断的核心是先定义合法范围，再保证每次状态转移都保持合法。<br>一旦出现 off-by-one，优先回看：索引边界、更新顺序、窗口长度计算。</p>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/05/LeetCode-%E8%BE%B9%E7%95%8C%E6%9D%A1%E4%BB%B6%E6%80%9D%E8%80%83/</id>
    <link href="https://jiarus.github.io/2026/03/05/LeetCode-%E8%BE%B9%E7%95%8C%E6%9D%A1%E4%BB%B6%E6%80%9D%E8%80%83/"/>
    <published>2026-03-05T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>LeetCode Hot 100</p>
</blockquote>
<hr>
<h2 id="为什么要系统性检查边界条件"><a href="#为什么要系统性检查边界条件" class="headerlink" title="为什么要系统性检查边界条件"></a>为什么要系统性检查边界条件</h2><p>边界条件的本质是：输入规模、窗口范围、索引合法性是否被完整覆盖。常见问题来自：</p>
<ul>
<li>空输入 &#x2F; 空字符串</li>
<li>单元素 &#x2F; 最小窗口</li>
<li>窗口刚好满足条件</li>
<li>计数回退导致的 off-by-one</li>
<li>排序 &#x2F; 哈希 &#x2F; 计数数组的索引越界</li>
</ul>]]>
    </summary>
    <title>边界条件思考</title>
    <updated>2026-03-05T10:19:48.710Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="LeetCode" scheme="https://jiarus.github.io/categories/LeetCode/"/>
    <category term="LeetCode" scheme="https://jiarus.github.io/tags/LeetCode/"/>
    <category term="Hot100" scheme="https://jiarus.github.io/tags/Hot100/"/>
    <content>
      <![CDATA[<blockquote><p>LeetCode Hot 100</p></blockquote><hr><h2 id="53-最大子数组和"><a href="#53-最大子数组和" class="headerlink" title="53. 最大子数组和"></a>53. 最大子数组和</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/maximum-subarray/">LeetCode 链接</a></p><p>给定一个整数数组 <code>nums</code>，找到一个具有最大和的连续子数组，返回其最大和。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = [<span class="string">-2</span>,1,<span class="string">-3</span>,4,<span class="string">-1</span>,2,1,<span class="string">-5</span>,4]</span><br><span class="line">输出：6</span><br><span class="line">解释：子数组 [4,<span class="string">-1</span>,2,1] 的和最大，为 6</span><br></pre></td></tr></table></figure><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>贪心&#x2F;动态规划：当前位置的最大子数组和只与前一位置的结果相关。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">maxSubArray</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="comment">// 以i结尾的最大值数组和  </span></span><br><span class="line">        <span class="comment">//pre[i] = max&#123;pre[i-1],nums[i]&#125;</span></span><br><span class="line">        <span class="comment">//求最大数组和，可以计算出每个位置的最大值数组和，再取最大</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">pre</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> nums[<span class="number">0</span>];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            pre = Math.max(pre+nums[i],nums[i]);</span><br><span class="line">            ans = Math.max(ans,pre);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr><h2 id="56-合并区间"><a href="#56-合并区间" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/merge-intervals/">LeetCode 链接</a></p><p>以数组 <code>intervals</code> 表示若干个区间，合并所有重叠的区间。</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：intervals = <span class="string">[[1,3],[2,6],[8,10],[15,18]]</span></span><br><span class="line">输出：<span class="string">[[1,6],[8,10],[15,18]]</span></span><br></pre></td></tr></table></figure><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>按起点排序后线性合并。</p><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span>[][] merge(<span class="type">int</span>[][] intervals) &#123;</span><br><span class="line">        <span class="comment">//排序</span></span><br><span class="line">        Arrays.sort(intervals,(a,b) -&gt; (a[<span class="number">0</span>]-b[<span class="number">0</span>]));</span><br><span class="line">        List&lt;<span class="type">int</span>[]&gt; ans  = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="comment">//循环，判断a[1]和b[0]大小</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span><span class="number">0</span>;i&lt;intervals.length;i++)&#123;</span><br><span class="line">            <span class="comment">//如果a[1]&gt;b[0]则可以合并</span></span><br><span class="line">            <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> ans.size();</span><br><span class="line">            <span class="keyword">if</span>(size&gt;<span class="number">0</span>&amp;&amp;ans.get(size-<span class="number">1</span>)[<span class="number">1</span>]&gt;=intervals[i][<span class="number">0</span>])&#123;</span><br><span class="line">                <span class="comment">//比较a[1]和b[1]哪个大保留哪个</span></span><br><span class="line">                ans.get(size-<span class="number">1</span>)[<span class="number">1</span>] = Math.max(ans.get(size-<span class="number">1</span>)[<span class="number">1</span>],intervals[i][<span class="number">1</span>]);</span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="comment">//如果a[1]&lt;b[0]则不能合并,添加到list</span></span><br><span class="line">                ans.add(intervals[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans.toArray(<span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">0</span>][]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n log n)，空间 O(n)</p><hr><h2 id="189-轮转数组"><a href="#189-轮转数组" class="headerlink" title="189. 轮转数组"></a>189. 轮转数组</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/rotate-array/">LeetCode 链接</a></p><p>给你一个数组，将数组中的元素向右轮转 <code>k</code> 个位置。</p><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = <span class="string">[1,2,3,4,5,6,7]</span>, k = <span class="number">3</span></span><br><span class="line">输出：<span class="string">[5,6,7,1,2,3,4]</span></span><br></pre></td></tr></table></figure><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>通过取模计算新索引位置，使用额外数组存储结果后覆盖原数组。</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">rotate</span><span class="params">(<span class="type">int</span>[] nums, <span class="type">int</span> k)</span> &#123;</span><br><span class="line">        <span class="comment">//计算新索引的位置 i = (i + k)%nums.length</span></span><br><span class="line">        <span class="comment">//索引0-5 移动1位 5 -&gt; (5+1)%6  = 0  0-&gt; (0+1)%6 = 1</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> nums.length;</span><br><span class="line">        <span class="type">int</span>[] ans = <span class="keyword">new</span> <span class="title class_">int</span>[len];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;len;i++)&#123;</span><br><span class="line">            ans[(i+k)%len] = nums[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//覆盖原数组</span></span><br><span class="line">        <span class="comment">//public static void arraycopy(</span></span><br><span class="line">        <span class="comment">// Object src,      // 源数组：要复制的原数组</span></span><br><span class="line">        <span class="comment">// int srcPos,      // 源数组起始位置：从源数组的第几个索引开始复制</span></span><br><span class="line">        <span class="comment">// Object dest,     // 目标数组：复制到的目标数组</span></span><br><span class="line">        <span class="comment">// int destPos,     // 目标数组起始位置：复制到目标数组的第几个索引</span></span><br><span class="line">        <span class="comment">// int length       // 复制长度：要复制的元素个数</span></span><br><span class="line">        <span class="comment">// )</span></span><br><span class="line">        System.arraycopy(ans,<span class="number">0</span>,nums,<span class="number">0</span>,len);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(n)</p><hr><h2 id="238-除自身以外数组的乘积"><a href="#238-除自身以外数组的乘积" class="headerlink" title="238. 除自身以外数组的乘积"></a>238. 除自身以外数组的乘积</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/product-of-array-except-self/">LeetCode 链接</a></p><p>给你一个数组 <code>nums</code>，返回数组 <code>answer</code>，其中 <code>answer[i]</code> 等于 <code>nums</code> 中除 <code>nums[i]</code> 之外其余各元素的乘积。</p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = [<span class="number">1,2,3,4</span>]</span><br><span class="line">输出：[<span class="number">24,12,8,6</span>]</span><br></pre></td></tr></table></figure><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>先算左侧前缀乘积，再从右往左乘上右侧前缀乘积。</p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span>[] productExceptSelf(<span class="type">int</span>[] nums) &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> nums.length;</span><br><span class="line">        <span class="type">int</span>[] res = <span class="keyword">new</span> <span class="title class_">int</span>[n];</span><br><span class="line">        res[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt; n; i++) &#123;</span><br><span class="line">            res[i] = res[i - <span class="number">1</span>] * nums[i - <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">right</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">            res[i] = res[i] * right;</span><br><span class="line">            right *= nums[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)（不计输出）</p><hr><h2 id="41-缺失的第一个正数"><a href="#41-缺失的第一个正数" class="headerlink" title="41. 缺失的第一个正数"></a>41. 缺失的第一个正数</h2><p><strong>难度</strong>：困难 | <a href="https://leetcode.cn/problems/first-missing-positive/">LeetCode 链接</a></p><p>给你一个未排序的整数数组 <code>nums</code>，请你找出其中没有出现的最小的正整数。</p><figure class="highlight fix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">输入：nums </span>=<span class="string"> [3,4,-1,1]</span></span><br><span class="line"><span class="string">输出：2</span></span><br></pre></td></tr></table></figure><h3 id="思路-4"><a href="#思路-4" class="headerlink" title="思路"></a>思路</h3><p>原地哈希：把 <code>1..n</code> 放到对应下标位置 <code>x -&gt; x-1</code>，再扫一遍找第一个不匹配的位置。</p><h3 id="代码-4"><a href="#代码-4" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">firstMissingPositive</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> nums.length;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">while</span> (nums[i] &gt;= <span class="number">1</span> &amp;&amp; nums[i] &lt;= n &amp;&amp; nums[nums[i] - <span class="number">1</span>] != nums[i]) &#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">tmp</span> <span class="operator">=</span> nums[i];</span><br><span class="line">                nums[i] = nums[tmp - <span class="number">1</span>];</span><br><span class="line">                nums[tmp - <span class="number">1</span>] = tmp;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (nums[i] != i + <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> i + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> n + <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><table><thead><tr><th>题目</th><th>核心技巧</th><th>时间</th><th>空间</th></tr></thead><tbody><tr><td>最大子数组和</td><td>贪心&#x2F;DP</td><td>O(n)</td><td>O(1)</td></tr><tr><td>合并区间</td><td>排序 + 扫描</td><td>O(n log n)</td><td>O(n)</td></tr><tr><td>轮转数组</td><td>三次翻转</td><td>O(n)</td><td>O(1)</td></tr><tr><td>除自身以外数组的乘积</td><td>前缀积</td><td>O(n)</td><td>O(1)</td></tr><tr><td>缺失的第一个正数</td><td>原地哈希</td><td>O(n)</td><td>O(1)</td></tr></tbody></table>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/04/LeetCode-04-%E6%95%B0%E7%BB%84/</id>
    <link href="https://jiarus.github.io/2026/03/04/LeetCode-04-%E6%95%B0%E7%BB%84/"/>
    <published>2026-03-04T03:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>LeetCode Hot 100</p>
</blockquote>
<hr>
<h2 id="53-最大子数组和"><a href="#53-最大子数组和" class="headerlink" title="53. 最大子数组和"></a>53. 最大子数组和</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/maximum-subarray/">LeetCode 链接</a></p>
<p>给定一个整数数组 <code>nums</code>，找到一个具有最大和的连续子数组，返回其最大和。</p>]]>
    </summary>
    <title>04_普通数组</title>
    <updated>2026-03-06T10:33:30.650Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="IELTS" scheme="https://jiarus.github.io/categories/IELTS/"/>
    <category term="IELTS" scheme="https://jiarus.github.io/tags/IELTS/"/>
    <category term="Study Log" scheme="https://jiarus.github.io/tags/Study-Log/"/>
    <content>
      <![CDATA[<blockquote><p>Target overall band: 6.5 (L 7 &#x2F; R 7 &#x2F; W 6.0 &#x2F; S 6.0)</p></blockquote><h2 id="Done-Today"><a href="#Done-Today" class="headerlink" title="Done Today"></a>Done Today</h2><ul><li>Listening: Section 2 intensive practice (20 mins)</li><li>Reading: Passage 1 timed practice (20 mins)</li><li>Writing: Task 1 structure review (15 mins)</li><li>Speaking: Part 1 topic cards (10 mins)</li></ul><h2 id="Notes"><a href="#Notes" class="headerlink" title="Notes"></a>Notes</h2><ul><li>Listening: slow response to paraphrases</li><li>Reading: first 5 minutes too slow for locating keywords</li><li>Writing: intro template needs trimming</li><li>Speaking: answers are long enough but lack examples</li></ul><h2 id="Plan-for-Tomorrow"><a href="#Plan-for-Tomorrow" class="headerlink" title="Plan for Tomorrow"></a>Plan for Tomorrow</h2><ul><li>Listening: Section 3 intensive practice (20 mins)</li><li>Reading: Passage 2 timed practice (20 mins)</li><li>Writing: Task 2 outline (15 mins)</li><li>Speaking: Part 2 topic prep (10 mins)</li></ul><h2 id="Weekly-Targets"><a href="#Weekly-Targets" class="headerlink" title="Weekly Targets"></a>Weekly Targets</h2><ul><li>2 full listening + reading timed sets</li><li>2 essays each for Task 1 &#x2F; Task 2</li><li>8 speaking topics</li></ul>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/IELTS-2026-03-01-ielts-study-log/</id>
    <link href="https://jiarus.github.io/2026/03/01/IELTS-2026-03-01-ielts-study-log/"/>
    <published>2026-03-01T06:00:00.000Z</published>
    <summary>Day 1 check-in with goals and weekly plan</summary>
    <title>IELTS Study Log | Day 1</title>
    <updated>2026-03-03T02:45:24.164Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="Cloud" scheme="https://jiarus.github.io/categories/Cloud/"/>
    <category term="AWS" scheme="https://jiarus.github.io/tags/AWS/"/>
    <category term="Certification" scheme="https://jiarus.github.io/tags/Certification/"/>
    <category term="DVA-C02" scheme="https://jiarus.github.io/tags/DVA-C02/"/>
    <content>
      <![CDATA[<blockquote><p>Goal: follow an actionable plan to pass AWS Certified Developer - Associate (DVA-C02).</p></blockquote><h2 id="Exam-Overview"><a href="#Exam-Overview" class="headerlink" title="Exam Overview"></a>Exam Overview</h2><ul><li>Duration: 130 minutes</li><li>Question types: multiple choice &#x2F; multiple response</li><li>Focus areas: development, deployment, monitoring, identity and access, best practices</li></ul><h2 id="Domain-Map"><a href="#Domain-Map" class="headerlink" title="Domain Map"></a>Domain Map</h2><ol><li><strong>Deployment</strong><ul><li>CodeDeploy &#x2F; CodePipeline &#x2F; CodeBuild</li><li>Blue&#x2F;Green and rolling deployments</li></ul></li><li><strong>Security</strong><ul><li>IAM policy boundaries, STS, role assumption</li><li>KMS, Secrets Manager, Parameter Store</li></ul></li><li><strong>Development with AWS Services</strong><ul><li>Lambda &#x2F; API Gateway &#x2F; DynamoDB &#x2F; SQS &#x2F; SNS</li><li>SDK retries, signing, pagination</li></ul></li><li><strong>Troubleshooting and Optimization</strong><ul><li>CloudWatch &#x2F; X-Ray</li><li>Latency and error investigation patterns</li></ul></li></ol><h2 id="4-Week-Plan"><a href="#4-Week-Plan" class="headerlink" title="4-Week Plan"></a>4-Week Plan</h2><h3 id="Week-1-Core-Services-Security"><a href="#Week-1-Core-Services-Security" class="headerlink" title="Week 1: Core Services + Security"></a>Week 1: Core Services + Security</h3><ul><li>IAM, STS, KMS</li><li>Lambda, API Gateway, DynamoDB</li><li>20 practice questions per day, log mistakes</li></ul><h3 id="Week-2-CI-CD-and-Deployment"><a href="#Week-2-CI-CD-and-Deployment" class="headerlink" title="Week 2: CI&#x2F;CD and Deployment"></a>Week 2: CI&#x2F;CD and Deployment</h3><ul><li>CodePipeline, CodeBuild, CodeDeploy</li><li>Elastic Beanstalk</li><li>Understand deployment strategies and rollback</li></ul><h3 id="Week-3-Messaging-and-Event-Driven"><a href="#Week-3-Messaging-and-Event-Driven" class="headerlink" title="Week 3: Messaging and Event-Driven"></a>Week 3: Messaging and Event-Driven</h3><ul><li>SQS, SNS, EventBridge</li><li>Step Functions</li><li>Lambda triggers and retry behavior</li></ul><h3 id="Week-4-Full-Reviews"><a href="#Week-4-Full-Reviews" class="headerlink" title="Week 4: Full Reviews"></a>Week 4: Full Reviews</h3><ul><li>2-3 mock exams</li><li>Review weak areas and mistakes</li></ul><h2 id="High-Frequency-Topics"><a href="#High-Frequency-Topics" class="headerlink" title="High-Frequency Topics"></a>High-Frequency Topics</h2><ul><li>DynamoDB keys, RCU&#x2F;WCU, GSI&#x2F;LSI</li><li>Lambda triggers, concurrency, cold starts</li><li>API Gateway auth (IAM&#x2F;Cognito&#x2F;custom)</li><li>SQS FIFO vs Standard</li><li>KMS vs Secrets Manager vs Parameter Store</li><li>CloudWatch Metrics&#x2F;Logs&#x2F;Alarms</li><li>X-Ray traces and service map</li></ul><h2 id="Study-Resources"><a href="#Study-Resources" class="headerlink" title="Study Resources"></a>Study Resources</h2><ul><li>Official exam guide and sample questions</li><li>Hands-on labs: 30-60 minutes daily</li><li>Use question banks to find gaps, not just to grind</li></ul><h2 id="Practical-Tips"><a href="#Practical-Tips" class="headerlink" title="Practical Tips"></a>Practical Tips</h2><ul><li>Turn common errors and retry rules into flash cards</li><li>For each wrong answer, note the correct service or config</li><li>Build one small serverless project (API Gateway + Lambda + DynamoDB)</li></ul><h2 id="Final-48-Hours"><a href="#Final-48-Hours" class="headerlink" title="Final 48 Hours"></a>Final 48 Hours</h2><ul><li>Stop new questions; review your error log</li><li>Revisit IAM, DynamoDB, Lambda, API Gateway</li><li>Sleep well and simulate exam timing</li></ul><h2 id="Wrap-up"><a href="#Wrap-up" class="headerlink" title="Wrap-up"></a>Wrap-up</h2><p>DVA-C02 rewards practical understanding over memorization. Stick to the plan, and you will be fine.</p>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/Cloud-2026-03-01-aws-dva-c02-prep/</id>
    <link href="https://jiarus.github.io/2026/03/01/Cloud-2026-03-01-aws-dva-c02-prep/"/>
    <published>2026-03-01T05:00:00.000Z</published>
    <summary>A practical 4-week plan and key topics for AWS Certified Developer - Associate (DVA-C02)</summary>
    <title>AWS DVA-C02 Study Guide</title>
    <updated>2026-03-01T15:24:37.806Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="Life" scheme="https://jiarus.github.io/categories/Life/"/>
    <category term="Planning" scheme="https://jiarus.github.io/tags/Planning/"/>
    <category term="Study" scheme="https://jiarus.github.io/tags/Study/"/>
    <content>
      <![CDATA[<blockquote><p>A minimal template to reduce decision fatigue and keep rhythm.</p></blockquote><h2 id="This-Week’s-Goals"><a href="#This-Week’s-Goals" class="headerlink" title="This Week’s Goals"></a>This Week’s Goals</h2><ol><li>Complete 3 notes</li><li>Solve 10 problems</li><li>Do 1 weekly review</li></ol><h2 id="Daily-Schedule"><a href="#Daily-Schedule" class="headerlink" title="Daily Schedule"></a>Daily Schedule</h2><table><thead><tr><th>Day</th><th>Theme</th><th>Notes</th></tr></thead><tbody><tr><td>Mon</td><td>Weekly review</td><td>30 mins</td></tr><tr><td>Tue</td><td>Reading + notes</td><td>60 mins</td></tr><tr><td>Wed</td><td>Practice</td><td>60 mins</td></tr><tr><td>Thu</td><td>Project cleanup</td><td>45 mins</td></tr><tr><td>Fri</td><td>Writing</td><td>60 mins</td></tr><tr><td>Sat</td><td>Free study</td><td>60 mins</td></tr><tr><td>Sun</td><td>Rest</td><td>light review</td></tr></tbody></table><h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><ul><li>Keep goals small and doable.</li><li>Only one core theme per day.</li></ul>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/Life-2026-03-01-study-plan/</id>
    <link href="https://jiarus.github.io/2026/03/01/Life-2026-03-01-study-plan/"/>
    <published>2026-03-01T03:00:00.000Z</published>
    <summary>A reusable weekly study plan</summary>
    <title>Weekly Study Plan Template</title>
    <updated>2026-03-01T15:15:55.580Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="Tools" scheme="https://jiarus.github.io/categories/Tools/"/>
    <category term="Git" scheme="https://jiarus.github.io/tags/Git/"/>
    <category term="Tools" scheme="https://jiarus.github.io/tags/Tools/"/>
    <content>
      <![CDATA[<blockquote><p>A compact reference for high-frequency Git commands.</p></blockquote><h2 id="Common-Commands"><a href="#Common-Commands" class="headerlink" title="Common Commands"></a>Common Commands</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;feat: add post&quot;</span></span><br><span class="line">git pull --rebase</span><br><span class="line">git push</span><br></pre></td></tr></table></figure><h2 id="Branch-Operations"><a href="#Branch-Operations" class="headerlink" title="Branch Operations"></a>Branch Operations</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b feature/post</span><br><span class="line">git switch main</span><br><span class="line">git merge feature/post</span><br></pre></td></tr></table></figure><h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><ul><li>Check <code>git status</code> before committing.</li><li>Prefer <code>git pull --rebase</code> to keep history clean.</li></ul>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/Tools-2026-03-01-git-notes/</id>
    <link href="https://jiarus.github.io/2026/03/01/Tools-2026-03-01-git-notes/"/>
    <published>2026-03-01T02:00:00.000Z</published>
    <summary>Common commands and a lightweight workflow</summary>
    <title>Git Quick Notes</title>
    <updated>2026-03-01T15:09:00.379Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="IELTS" scheme="https://jiarus.github.io/categories/IELTS/"/>
    <category term="IELTS" scheme="https://jiarus.github.io/tags/IELTS/"/>
    <category term="单词" scheme="https://jiarus.github.io/tags/%E5%8D%95%E8%AF%8D/"/>
    <category term="笔记" scheme="https://jiarus.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>3月单词、短语、句型积累</p><hr><h2 id="Week-1-教育-Education"><a href="#Week-1-教育-Education" class="headerlink" title="Week 1 | 教育 Education"></a>Week 1 | 教育 Education</h2><h3 id="核心词汇"><a href="#核心词汇" class="headerlink" title="核心词汇"></a>核心词汇</h3><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left">curriculum</td><td align="center">n</td><td align="left">课程体系</td><td align="left">The school has updated its curriculum.</td></tr><tr><td align="left">tuition</td><td align="center">n</td><td align="left">学费；教学</td><td align="left">Tuition fees have risen sharply.</td></tr><tr><td align="left">literacy</td><td align="center">n</td><td align="left">读写能力</td><td align="left">Improving adult literacy is essential.</td></tr><tr><td align="left">dropout</td><td align="center">n</td><td align="left">辍学者</td><td align="left">The dropout rate has decreased.</td></tr><tr><td align="left">mixed-ability class</td><td align="center">n</td><td align="left">混合班</td><td align="left">Teaching a mixed-ability class is challenging.</td></tr><tr><td align="left">compulsory schooling</td><td align="center">n</td><td align="left">义务教育</td><td align="left">Compulsory schooling lasts for 9 years.</td></tr><tr><td align="left">compulsory subjects</td><td align="center">n</td><td align="left">必修科目</td><td align="left">Math and English are compulsory subjects.</td></tr><tr><td align="left">value</td><td align="center">v</td><td align="left">看重</td><td align="left">Parents value education highly.</td></tr><tr><td align="left">hard work</td><td align="center">n</td><td align="left">勤奋</td><td align="left">Success comes from hard work.</td></tr><tr><td align="left">accuracy</td><td align="center">n</td><td align="left">准确度</td><td align="left">Accuracy is important in writing.</td></tr><tr><td align="left">values</td><td align="center">n</td><td align="left">价值观</td><td align="left">Schools help shape students’ values.</td></tr><tr><td align="left">optional</td><td align="center">adj</td><td align="left">可选的</td><td align="left">Art is an optional subject.</td></tr><tr><td align="left">invaluable</td><td align="center">adj</td><td align="left">极有价值的</td><td align="left">The experience was invaluable.</td></tr><tr><td align="left">parenting</td><td align="center">n</td><td align="left">父母养育</td><td align="left">Good parenting affects children’s development.</td></tr></tbody></table><h3 id="表达升级"><a href="#表达升级" class="headerlink" title="表达升级"></a>表达升级</h3><table><thead><tr><th align="left">基础表达</th><th align="left">高级替换</th></tr></thead><tbody><tr><td align="left">important</td><td align="left">crucial &#x2F; vital &#x2F; essential &#x2F; paramount</td></tr><tr><td align="left">more and more</td><td align="left">an increasing number of &#x2F; a growing proportion of</td></tr><tr><td align="left">very good</td><td align="left">excellent &#x2F; outstanding &#x2F; exceptional</td></tr><tr><td align="left">help</td><td align="left">facilitate &#x2F; contribute to &#x2F; foster</td></tr><tr><td align="left">bad</td><td align="left">detrimental &#x2F; adverse &#x2F; harmful</td></tr><tr><td align="left">think</td><td align="left">maintain &#x2F; argue &#x2F; contend &#x2F; hold the view that</td></tr><tr><td align="left">students learn</td><td align="left">students acquire knowledge &#x2F; develop skills</td></tr><tr><td align="left">have problems</td><td align="left">encounter difficulties &#x2F; face challenges</td></tr><tr><td align="left">because</td><td align="left">due to &#x2F; owing to &#x2F; on account of</td></tr><tr><td align="left">so</td><td align="left">consequently &#x2F; as a result &#x2F; therefore</td></tr></tbody></table><h3 id="好句积累"><a href="#好句积累" class="headerlink" title="好句积累"></a>好句积累</h3><blockquote><p>Education is not merely about acquiring knowledge, but about fostering critical thinking and creativity.<br>教育不仅仅是获取知识，更是培养批判性思维和创造力。</p></blockquote><blockquote><p>It is widely acknowledged that equal access to quality education can bridge the gap between different social classes.<br>人们普遍认为，平等获得优质教育可以缩小不同社会阶层之间的差距。</p></blockquote><h3 id="错误拆解"><a href="#错误拆解" class="headerlink" title="错误拆解"></a>错误拆解</h3><p><strong>写作常见错误</strong></p><table><thead><tr><th align="left">错误</th><th align="left">正确</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"><del>The education is important.</del></td><td align="left">Education is important.</td><td align="left">抽象概念不加 the</td></tr><tr><td align="left"><del>Many students wants…</del></td><td align="left">Many students want…</td><td align="left">主谓一致</td></tr><tr><td align="left"><del>It has many benefits, such as improve…</del></td><td align="left">…such as improving…</td><td align="left">such as 后接名词&#x2F;动名词</td></tr></tbody></table><p><strong>阅读踩坑</strong></p><ul><li>看到 <code>NOT GIVEN</code> 和 <code>FALSE</code> 总是混淆 → 记住：NG 是”文中没提”，FALSE 是”文中说了相反的”</li></ul><h3 id="Meta-思考"><a href="#Meta-思考" class="headerlink" title="Meta 思考"></a>Meta 思考</h3><blockquote><p>这周发现自己写作时总想用中文思维直译，比如”提高学生的能力”写成 “improve students’ ability”，其实更地道的说法是 “enhance students’ competence” 或 “develop students’ capability”。下周要刻意练习先想英文表达框架，再填内容。</p></blockquote><hr><h2 id="Week-2-科技-Technology"><a href="#Week-2-科技-Technology" class="headerlink" title="Week 2 | 科技 Technology"></a>Week 2 | 科技 Technology</h2><h3 id="核心词汇-1"><a href="#核心词汇-1" class="headerlink" title="核心词汇"></a>核心词汇</h3><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="表达升级-1"><a href="#表达升级-1" class="headerlink" title="表达升级"></a>表达升级</h3><table><thead><tr><th align="left">基础表达</th><th align="left">高分替换</th></tr></thead><tbody><tr><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="好句积累-1"><a href="#好句积累-1" class="headerlink" title="好句积累"></a>好句积累</h3><blockquote></blockquote><h3 id="错误拆解-1"><a href="#错误拆解-1" class="headerlink" title="错误拆解"></a>错误拆解</h3><p><strong>写作常见错误</strong></p><table><thead><tr><th align="left">错误</th><th align="left">正确</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="Meta-思考-1"><a href="#Meta-思考-1" class="headerlink" title="Meta 思考"></a>Meta 思考</h3><blockquote></blockquote><hr><h2 id="Week-3-环境-Environment"><a href="#Week-3-环境-Environment" class="headerlink" title="Week 3 | 环境 Environment"></a>Week 3 | 环境 Environment</h2><h3 id="核心词汇-2"><a href="#核心词汇-2" class="headerlink" title="核心词汇"></a>核心词汇</h3><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="表达升级-2"><a href="#表达升级-2" class="headerlink" title="表达升级"></a>表达升级</h3><table><thead><tr><th align="left">基础表达</th><th align="left">高分替换</th></tr></thead><tbody><tr><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="好句积累-2"><a href="#好句积累-2" class="headerlink" title="好句积累"></a>好句积累</h3><blockquote></blockquote><h3 id="错误拆解-2"><a href="#错误拆解-2" class="headerlink" title="错误拆解"></a>错误拆解</h3><p><strong>写作常见错误</strong></p><table><thead><tr><th align="left">错误</th><th align="center">正确</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td></tr></tbody></table><h3 id="Meta-思考-2"><a href="#Meta-思考-2" class="headerlink" title="Meta 思考"></a>Meta 思考</h3><blockquote></blockquote><hr><h2 id="Week-4-健康-Health"><a href="#Week-4-健康-Health" class="headerlink" title="Week 4 | 健康 Health"></a>Week 4 | 健康 Health</h2><h3 id="核心词汇-3"><a href="#核心词汇-3" class="headerlink" title="核心词汇"></a>核心词汇</h3><table><thead><tr><th align="left">单词</th><th align="center">词性</th><th align="left">释义</th><th align="left">例句</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="表达升级-3"><a href="#表达升级-3" class="headerlink" title="表达升级"></a>表达升级</h3><table><thead><tr><th align="left">基础表达</th><th align="left">高分替换</th></tr></thead><tbody><tr><td align="left"></td><td align="left"></td></tr></tbody></table><h3 id="好句积累-3"><a href="#好句积累-3" class="headerlink" title="好句积累"></a>好句积累</h3><blockquote></blockquote><h3 id="错误拆解-3"><a href="#错误拆解-3" class="headerlink" title="错误拆解"></a>错误拆解</h3><p><strong>写作常见错误</strong></p><table><thead><tr><th align="left">错误</th><th align="center">正确</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left"></td><td align="center"></td><td align="left"></td></tr></tbody></table><h3 id="Meta-思考-3"><a href="#Meta-思考-3" class="headerlink" title="Meta 思考"></a>Meta 思考</h3><blockquote></blockquote><hr><h2 id="本月统计"><a href="#本月统计" class="headerlink" title="本月统计"></a>本月统计</h2><table><thead><tr><th align="center">周次</th><th align="center">单词</th><th align="center">短语</th><th align="center">句型</th></tr></thead><tbody><tr><td align="center">Week 1</td><td align="center">5</td><td align="center">5</td><td align="center">1</td></tr><tr><td align="center">Week 2</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 3</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">Week 4</td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center"><strong>合计</strong></td><td align="center"></td><td align="center"></td><td align="center"></td></tr></tbody></table>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/IELTS-2026-03-ielts-vocabulary/</id>
    <link href="https://jiarus.github.io/2026/03/01/IELTS-2026-03-ielts-vocabulary/"/>
    <published>2026-03-01T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>3月单词、短语、句型积累</p>
<hr>
<h2 id="Week-1-教育-Education"><a href="#Week-1-教育-Education" class="headerlink" title="Week 1 | 教育 Education"></a>Week 1 | 教育 Education</h2><h3 id="核心词汇"><a href="#核心词汇" class="headerlink" title="核心词汇"></a>核心词汇</h3><table>
<thead>
<tr>
<th align="left">单词</th>
<th align="center">词性</th>
<th align="left">释义</th>
<th align="left">例句</th>
</tr>
</thead>
<tbody><tr>
<td align="left">curriculum</td>
<td align="center">n</td>
<td align="left">课程体系</td>
<td align="left">The school has updated its curriculum.</td>
</tr>
<tr>
<td align="left">tuition</td>
<td align="center">n</td>
<td align="left">学费；教学</td>
<td align="left">Tuition fees have risen sharply.</td>
</tr>
<tr>
<td align="left">literacy</td>
<td align="center">n</td>
<td align="left">读写能力</td>
<td align="left">Improving adult literacy is essential.</td>
</tr>
<tr>
<td align="left">dropout</td>
<td align="center">n</td>
<td align="left">辍学者</td>
<td align="left">The dropout rate has decreased.</td>
</tr>
<tr>
<td align="left">mixed-ability class</td>
<td align="center">n</td>
<td align="left">混合班</td>
<td align="left">Teaching a mixed-ability class is challenging.</td>
</tr>
<tr>
<td align="left">compulsory schooling</td>
<td align="center">n</td>
<td align="left">义务教育</td>
<td align="left">Compulsory schooling lasts for 9 years.</td>
</tr>
<tr>
<td align="left">compulsory subjects</td>
<td align="center">n</td>
<td align="left">必修科目</td>
<td align="left">Math and English are compulsory subjects.</td>
</tr>
<tr>
<td align="left">value</td>
<td align="center">v</td>
<td align="left">看重</td>
<td align="left">Parents value education highly.</td>
</tr>
<tr>
<td align="left">hard work</td>
<td align="center">n</td>
<td align="left">勤奋</td>
<td align="left">Success comes from hard work.</td>
</tr>
<tr>
<td align="left">accuracy</td>
<td align="center">n</td>
<td align="left">准确度</td>
<td align="left">Accuracy is important in writing.</td>
</tr>
<tr>
<td align="left">values</td>
<td align="center">n</td>
<td align="left">价值观</td>
<td align="left">Schools help shape students’ values.</td>
</tr>
<tr>
<td align="left">optional</td>
<td align="center">adj</td>
<td align="left">可选的</td>
<td align="left">Art is an optional subject.</td>
</tr>
<tr>
<td align="left">invaluable</td>
<td align="center">adj</td>
<td align="left">极有价值的</td>
<td align="left">The experience was invaluable.</td>
</tr>
<tr>
<td align="left">parenting</td>
<td align="center">n</td>
<td align="left">父母养育</td>
<td align="left">Good parenting affects children’s development.</td>
</tr>
</tbody></table>]]>
    </summary>
    <title>IELTS 备考笔记 | 3月</title>
    <updated>2026-03-03T08:51:55.292Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="Hexo" scheme="https://jiarus.github.io/categories/Hexo/"/>
    <category term="Hexo" scheme="https://jiarus.github.io/tags/Hexo/"/>
    <category term="Blog" scheme="https://jiarus.github.io/tags/Blog/"/>
    <content>
      <![CDATA[<blockquote><p>A minimal Hexo checklist to get started fast.</p></blockquote><h2 id="Install"><a href="#Install" class="headerlink" title="Install"></a>Install</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br></pre></td></tr></table></figure><h2 id="Init"><a href="#Init" class="headerlink" title="Init"></a>Init</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo init my-blog</span><br><span class="line"><span class="built_in">cd</span> my-blog</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><h2 id="Common-Commands"><a href="#Common-Commands" class="headerlink" title="Common Commands"></a>Common Commands</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hexo new <span class="string">&quot;My First Post&quot;</span></span><br><span class="line">hexo clean</span><br><span class="line">hexo generate</span><br><span class="line">hexo server</span><br></pre></td></tr></table></figure><h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><ul><li>Verify local preview first.</li><li>Tweak theme and plugins later.</li></ul>]]>
    </content>
    <id>https://jiarus.github.io/2026/03/01/Hexo-2026-03-01-hexo-quick-start/</id>
    <link href="https://jiarus.github.io/2026/03/01/Hexo-2026-03-01-hexo-quick-start/"/>
    <published>2026-03-01T01:00:00.000Z</published>
    <summary>Minimal steps from install to publish</summary>
    <title>Hexo Quick Start</title>
    <updated>2026-03-01T15:09:00.353Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="LeetCode" scheme="https://jiarus.github.io/categories/LeetCode/"/>
    <category term="LeetCode" scheme="https://jiarus.github.io/tags/LeetCode/"/>
    <category term="Hot100" scheme="https://jiarus.github.io/tags/Hot100/"/>
    <content>
      <![CDATA[<blockquote><p>LeetCode Hot 100</p></blockquote><hr><h2 id="3-无重复字符的最长子串"><a href="#3-无重复字符的最长子串" class="headerlink" title="3. 无重复字符的最长子串"></a>3. 无重复字符的最长子串</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/longest-substring-without-repeating-characters/">LeetCode 链接</a></p><p>给定一个字符串 <code>s</code>，请找出其中不含有重复字符的最长子串的长度。</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">输入: s = &quot;abcabcbb&quot;</span></span><br><span class="line"><span class="section">输出: 3</span></span><br><span class="line"><span class="section">解释: 因为无重复字符的最长子串是 &quot;abc&quot;，所以其长度为 3。</span></span><br></pre></td></tr></table></figure><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>使用滑动窗口维护一个不含重复字符的区间 <code>[left, right]</code>。当右指针遇到重复字符时，移动左指针直到窗口内无重复。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">lengthOfLongestSubstring</span><span class="params">(String s)</span> &#123;</span><br><span class="line">        <span class="comment">//使用滑动窗口</span></span><br><span class="line">        Set&lt;Character&gt; set = <span class="keyword">new</span> <span class="title class_">HashSet</span>&lt;&gt;();</span><br><span class="line">        <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> s.length();</span><br><span class="line">        <span class="type">int</span> <span class="variable">lPointer</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">rPointer</span> <span class="operator">=</span> <span class="number">0</span>;rPointer&lt;length;rPointer++) &#123;</span><br><span class="line">            <span class="comment">//移动右指针，添加字符</span></span><br><span class="line">            <span class="type">Character</span> <span class="variable">c</span> <span class="operator">=</span> s.charAt(rPointer);</span><br><span class="line">            <span class="keyword">while</span>(set.contains(c))&#123;</span><br><span class="line">                <span class="comment">//如果集合包含字符，移动左指针移，除左指针所在位置字符，直到移除掉重复字符</span></span><br><span class="line">                set.remove(s.charAt(lPointer));</span><br><span class="line">                lPointer++;</span><br><span class="line">            &#125;</span><br><span class="line">            set.add(c);</span><br><span class="line">            <span class="comment">//记录最大值</span></span><br><span class="line">            ans = Math.max(ans,rPointer-lPointer+<span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O (min (m, n)) 其中 m 是字符集大小。比如英文字母最多 26 个，ASCII 字符最多 128 个</p><hr><h2 id="438-找到字符串中所有字母异位词"><a href="#438-找到字符串中所有字母异位词" class="headerlink" title="438. 找到字符串中所有字母异位词"></a>438. 找到字符串中所有字母异位词</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/find-all-anagrams-in-a-string/">LeetCode 链接</a></p><p>给定两个字符串 <code>s</code> 和 <code>p</code>，找到 <code>s</code> 中所有 <code>p</code> 的异位词的子串，返回这些子串的起始索引。</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">输入: s = <span class="string">&quot;cbaebabacd&quot;</span>, <span class="selector-tag">p</span> = <span class="string">&quot;abc&quot;</span></span><br><span class="line">输出: <span class="selector-attr">[0,6]</span></span><br><span class="line">解释:</span><br><span class="line">起始索引等于 <span class="number">0</span> 的子串是 <span class="string">&quot;cba&quot;</span>，它是 <span class="string">&quot;abc&quot;</span> 的异位词。</span><br><span class="line">起始索引等于 <span class="number">6</span> 的子串是 <span class="string">&quot;bac&quot;</span>，它是 <span class="string">&quot;abc&quot;</span> 的异位词。</span><br></pre></td></tr></table></figure><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>把 <code>p</code> 映射为频次数组， 维护固定长度为 <code>p.length()</code> 的滑动窗口，在 <code>s</code> 上移动，统计窗口内字符频次与 <code>p</code> 的频次进行比较。</p><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> List&lt;Integer&gt; <span class="title function_">findAnagrams</span><span class="params">(String s, String p)</span> &#123;</span><br><span class="line">        <span class="comment">//把字符串p映射成0~25的数组上分别对应a~z</span></span><br><span class="line">        <span class="type">int</span>[] pCnt = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">26</span>];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;i&lt;p.length();i++)&#123;</span><br><span class="line">            pCnt[p.charAt(i) - <span class="string">&#x27;a&#x27;</span>] ++ ; <span class="comment">//如：a-a =0 ,b-a = 1 </span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//同理把滑动窗口也映射到数组上</span></span><br><span class="line">        <span class="type">int</span>[] wCnt = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">26</span>];</span><br><span class="line">        List&lt;Integer&gt; res = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">r</span> <span class="operator">=</span> <span class="number">0</span>;r&lt;s.length();r++)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> r - p.length() + <span class="number">1</span>;</span><br><span class="line">            <span class="comment">//记录字符</span></span><br><span class="line">            wCnt[s.charAt(r) - <span class="string">&#x27;a&#x27;</span>] ++;</span><br><span class="line">            <span class="comment">//窗口需要和p长度一致</span></span><br><span class="line">            <span class="keyword">if</span>(r&lt;p.length()-<span class="number">1</span>)&#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//比较两个数组是否相同</span></span><br><span class="line">            <span class="keyword">if</span>(Arrays.equals(pCnt,wCnt))&#123;</span><br><span class="line">                res.add(l);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//继续寻找</span></span><br><span class="line">            <span class="comment">//左指针移动，恢复现场</span></span><br><span class="line">            wCnt[s.charAt(l) - <span class="string">&#x27;a&#x27;</span>] --;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr><h2 id="239-滑动窗口最大值"><a href="#239-滑动窗口最大值" class="headerlink" title="239. 滑动窗口最大值"></a>239. 滑动窗口最大值</h2><p><strong>难度</strong>：困难 | <a href="https://leetcode.cn/problems/sliding-window-maximum/">LeetCode 链接</a></p><p>给你一个整数数组 <code>nums</code>，有一个大小为 <code>k</code> 的滑动窗口从数组的最左侧移动到最右侧。返回每个窗口中的最大值。</p><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = <span class="string">[1,3,-1,-3,5,3,6,7]</span>, k = <span class="number">3</span></span><br><span class="line">输出：<span class="string">[3,3,5,5,6,7]</span></span><br></pre></td></tr></table></figure><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>使用单调队列（递减）。队头始终是当前窗口最大值。窗口移动时，移除过期元素并保持队列单调性。</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span>[] maxSlidingWindow(<span class="type">int</span>[] nums, <span class="type">int</span> k) &#123;</span><br><span class="line">        <span class="comment">//双端队列实现（队列最左边为最大元素） 左-&gt;右 （队首-&gt;队尾）</span></span><br><span class="line">        <span class="comment">//维护方法：及时弹出小于队尾的元素，保证双端队列有序</span></span><br><span class="line">        Deque&lt;Integer&gt; q = <span class="keyword">new</span> <span class="title class_">ArrayDeque</span>&lt;&gt;();</span><br><span class="line">        <span class="comment">//一个有 nums.length - k +1 个窗口</span></span><br><span class="line">        <span class="type">int</span>[] ans = <span class="keyword">new</span> <span class="title class_">int</span>[nums.length-k+<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span><span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            <span class="comment">//入队</span></span><br><span class="line">            <span class="comment">//过滤小于队尾的元素</span></span><br><span class="line">            <span class="keyword">while</span>(!q.isEmpty()&amp;&amp;nums[q.getLast()]&lt;=nums[i])&#123;</span><br><span class="line">                q.removeLast();</span><br><span class="line">            &#125;</span><br><span class="line">            q.addLast(i);</span><br><span class="line">            <span class="comment">//出队</span></span><br><span class="line">            <span class="comment">//如果队首元素超出了这个滑动窗口（即 小于 i -k +1）移除队首元素</span></span><br><span class="line">            <span class="keyword">if</span>(q.getFirst()&lt;i-k+<span class="number">1</span>)&#123;</span><br><span class="line">                q.removeFirst();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//记录最大值</span></span><br><span class="line">            <span class="keyword">if</span>(i&gt;=k-<span class="number">1</span>)&#123;</span><br><span class="line">                ans[i-k+<span class="number">1</span>] = nums[q.getFirst()];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(k)</p><hr><h2 id="76-最小覆盖子串"><a href="#76-最小覆盖子串" class="headerlink" title="76. 最小覆盖子串"></a>76. 最小覆盖子串</h2><p><strong>难度</strong>：困难 | <a href="https://leetcode.cn/problems/minimum-window-substring/">LeetCode 链接</a></p><p>给你一个字符串 <code>s</code> 和一个字符串 <code>t</code>，返回 <code>s</code> 中涵盖 <code>t</code> 所有字符的最小子串。</p><figure class="highlight excel"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：s = <span class="string">&quot;ADOBECODEBANC&quot;</span>, <span class="built_in">t</span> = <span class="string">&quot;ABC&quot;</span></span><br><span class="line">输出：<span class="string">&quot;BANC&quot;</span></span><br></pre></td></tr></table></figure><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>滑动窗口统计 <code>t</code> 中字符需求。右指针扩展满足需求后，左指针尽量收缩以缩小窗口，并记录最短区间。</p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="comment">//字符串不连续的情况</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">minWindow</span><span class="params">(String s, String t)</span> &#123;</span><br><span class="line">        <span class="type">int</span>[] tCharArr = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">128</span>];</span><br><span class="line"></span><br><span class="line">        <span class="comment">//初始化</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;t.length();i++)&#123;</span><br><span class="line">            <span class="type">char</span> <span class="variable">c</span> <span class="operator">=</span> t.charAt(i);</span><br><span class="line">            tCharArr[c]++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span>[] ansCharArr = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">128</span>];</span><br><span class="line">        <span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">ansL</span> <span class="operator">=</span> -<span class="number">1</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">ansR</span> <span class="operator">=</span> s.length();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> r=<span class="number">0</span>;r&lt;s.length();r++)&#123;</span><br><span class="line">            <span class="type">char</span> <span class="variable">c</span> <span class="operator">=</span> s.charAt(r);</span><br><span class="line">            ansCharArr[c]++;</span><br><span class="line">            <span class="comment">//判断是否覆盖</span></span><br><span class="line">            <span class="keyword">while</span>(isCovered(tCharArr,ansCharArr))&#123;</span><br><span class="line">                <span class="comment">//判断最小子字符串是否缩短</span></span><br><span class="line">                <span class="keyword">if</span>(r-l&lt;ansR-ansL)&#123;</span><br><span class="line">                    <span class="comment">//记录边界</span></span><br><span class="line">                    ansL = l;</span><br><span class="line">                    ansR = r;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">//删除最左边元素</span></span><br><span class="line">                ansCharArr[s.charAt(l)]--;</span><br><span class="line">                <span class="comment">//左边界向右移动</span></span><br><span class="line">                l++;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ansL &lt; <span class="number">0</span> ? <span class="string">&quot;&quot;</span>:s.substring(ansL,ansR+<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">isCovered</span><span class="params">(<span class="type">int</span>[] tCharArr,<span class="type">int</span>[] ansCharArr)</span>&#123;</span><br><span class="line">        <span class="comment">//逐个字符比较大小</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="string">&#x27;A&#x27;</span>;i&lt;=<span class="string">&#x27;Z&#x27;</span>;i++)&#123;</span><br><span class="line">            <span class="comment">//ans是长字符串 t是短字符串</span></span><br><span class="line">            <span class="keyword">if</span>(ansCharArr[i]&lt;tCharArr[i])&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="string">&#x27;a&#x27;</span>;i&lt;=<span class="string">&#x27;z&#x27;</span>;i++)&#123;</span><br><span class="line">            <span class="comment">//ans是长字符串 t是短字符串</span></span><br><span class="line">            <span class="keyword">if</span>(ansCharArr[i]&lt;tCharArr[i])&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr>]]>
    </content>
    <id>https://jiarus.github.io/2025/05/04/LeetCode-03-%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3/</id>
    <link href="https://jiarus.github.io/2025/05/04/LeetCode-03-%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3/"/>
    <published>2025-05-04T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>LeetCode Hot 100</p>
</blockquote>
<hr>
<h2 id="3-无重复字符的最长子串"><a href="#3-无重复字符的最长子串" class="headerlink" title="3. 无重复字符的最长子串"></a>3. 无重复字符的最长子串</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/longest-substring-without-repeating-characters/">LeetCode 链接</a></p>
<p>给定一个字符串 <code>s</code>，请找出其中不含有重复字符的最长子串的长度。</p>]]>
    </summary>
    <title>03_滑动窗口</title>
    <updated>2026-03-05T13:05:49.837Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="LeetCode" scheme="https://jiarus.github.io/categories/LeetCode/"/>
    <category term="LeetCode" scheme="https://jiarus.github.io/tags/LeetCode/"/>
    <category term="Hot100" scheme="https://jiarus.github.io/tags/Hot100/"/>
    <content>
      <![CDATA[<blockquote><p>🎯 LeetCode Hot 100</p></blockquote><hr><h2 id="1-两数之和"><a href="#1-两数之和" class="headerlink" title="1. 两数之和"></a>1. 两数之和</h2><p><strong>难度</strong>：简单 | <a href="https://leetcode.cn/problems/two-sum/">LeetCode 链接</a></p><p>给定数组 <code>nums</code> 和目标值 <code>target</code>，找出和为目标值的两个数的下标。</p><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = <span class="comment">[2,7,11,15]</span>, target = 9</span><br><span class="line">输出：<span class="comment">[0,1]</span></span><br></pre></td></tr></table></figure><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>用哈希表存储已遍历的 <code>值 → 索引</code>，每次查找 <code>target - 当前值</code> 是否存在。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span>[] twoSum(<span class="type">int</span>[] nums, <span class="type">int</span> target) &#123;</span><br><span class="line">        <span class="comment">//hashmap 存放value-&gt;index</span></span><br><span class="line">        Map&lt;Integer,Integer&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">requireValue</span> <span class="operator">=</span> target - nums[i];</span><br><span class="line">            <span class="comment">//requireValue如果存在，即找到和为target的两个数</span></span><br><span class="line">            <span class="keyword">if</span>(map.containsKey(requireValue))&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">int</span>[]&#123;i,map.get(requireValue)&#125;;</span><br><span class="line">            &#125;</span><br><span class="line">            map.put(nums[i],i);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">int</span>[]&#123;&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(n)</p><hr><h2 id="49-字母异位词分组"><a href="#49-字母异位词分组" class="headerlink" title="49. 字母异位词分组"></a>49. 字母异位词分组</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/group-anagrams/">LeetCode 链接</a></p><p>给定字符串数组，将字母异位词组合在一起。</p><figure class="highlight prolog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：[<span class="string">&quot;eat&quot;</span>,<span class="string">&quot;tea&quot;</span>,<span class="string">&quot;tan&quot;</span>,<span class="string">&quot;ate&quot;</span>,<span class="string">&quot;nat&quot;</span>,<span class="string">&quot;bat&quot;</span>]</span><br><span class="line">输出：[[<span class="string">&quot;bat&quot;</span>],[<span class="string">&quot;nat&quot;</span>,<span class="string">&quot;tan&quot;</span>],[<span class="string">&quot;ate&quot;</span>,<span class="string">&quot;eat&quot;</span>,<span class="string">&quot;tea&quot;</span>]]</span><br></pre></td></tr></table></figure><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>将每个字符串排序后作为 <code>key</code>，相同 <code>key</code> 的放入同一组。</p><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> List&lt;List&lt;String&gt;&gt; <span class="title function_">groupAnagrams</span><span class="params">(String[] strs)</span> &#123;</span><br><span class="line">        <span class="comment">//使用Map存放，排序好的字符串-&gt;原字符串List</span></span><br><span class="line">        Map&lt;String,List&lt;String&gt;&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;strs.length;i++)&#123;</span><br><span class="line">            <span class="type">char</span>[] strArr = strs[i].toCharArray();</span><br><span class="line">            Arrays.sort(strArr);</span><br><span class="line">            <span class="type">String</span> <span class="variable">sortedStr</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(strArr);</span><br><span class="line">            <span class="comment">//如果map包含已排序好字符串add,否则new ArrayList并add</span></span><br><span class="line">            map.computeIfAbsent(sortedStr,k-&gt;<span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;()).add(strs[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(map.values());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(nk log k)，空间 O(nk)</p><table><thead><tr><th>分析</th><th>说明</th></tr></thead><tbody><tr><td>时间</td><td>排序单个字符串 O(k log k)，共 n 个字符串 → O(nk log k)</td></tr><tr><td>空间</td><td>存储 n 个字符串，平均长度 k → O(nk)</td></tr></tbody></table><p>💡 <strong>优化</strong>：用字母计数代替排序，时间可优化到 O(nk)</p><hr><h2 id="128-最长连续序列"><a href="#128-最长连续序列" class="headerlink" title="128. 最长连续序列"></a>128. 最长连续序列</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/longest-consecutive-sequence/">LeetCode 链接</a></p><p>找出数组中最长连续序列的长度，要求 O(n) 时间复杂度。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：<span class="selector-attr">[100,4,200,1,3,2]</span></span><br><span class="line">输出：<span class="number">4</span>  // 序列 <span class="selector-attr">[1,2,3,4]</span></span><br></pre></td></tr></table></figure><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>用 <code>HashSet</code> 存储所有数字，只从序列起点开始计数。</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">longestConsecutive</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="comment">//1.去重</span></span><br><span class="line">        Set&lt;Integer&gt; set = <span class="keyword">new</span> <span class="title class_">HashSet</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            set.add(nums[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//2.寻找子串的起点值</span></span><br><span class="line">        <span class="keyword">for</span>(Integer x:set)&#123;</span><br><span class="line">            <span class="comment">//如果有下一个不是起点，跳过</span></span><br><span class="line">            <span class="keyword">if</span>(set.contains(x-<span class="number">1</span>))&#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">int</span> <span class="variable">y</span> <span class="operator">=</span> x + <span class="number">1</span>;</span><br><span class="line">            <span class="comment">//3.循环计数</span></span><br><span class="line">            <span class="keyword">while</span>(set.contains(y))&#123;</span><br><span class="line">                y++;<span class="comment">//跳出循环时最后一个y要去掉</span></span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//4.记录最大值,x~y-1 连续数= y-x</span></span><br><span class="line">            ans = Math.max(ans,y-x);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(n)</p><hr><h2 id="560-和为-K-的子数组"><a href="#560-和为-K-的子数组" class="headerlink" title="560. 和为 K 的子数组"></a>560. 和为 K 的子数组</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/subarray-sum-equals-k/">LeetCode 链接</a></p><p>给定一个整数数组 <code>nums</code> 和一个整数 <code>k</code>，请你统计并返回该数组中和为 <code>k</code> 的连续子数组的个数。</p><figure class="highlight fix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">输入：nums </span>=<span class="string"> [1,1,1], k = 2</span></span><br><span class="line"><span class="string">输出：2</span></span><br></pre></td></tr></table></figure><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>使用前缀和 + 哈希表统计前缀出现次数。当前前缀和为 <code>sum</code>，若存在 <code>sum - k</code> 的前缀出现过，则说明以当前位置结尾的子数组可满足条件。</p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">subarraySum</span><span class="params">(<span class="type">int</span>[] nums, <span class="type">int</span> k)</span> &#123;</span><br><span class="line">        Map&lt;Integer,Integer&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        <span class="comment">//key: if pre[i],pre[j] is the sum of 0~i/0~j</span></span><br><span class="line">        <span class="comment">//want solve: pre[i] - pre[j-1] = k</span></span><br><span class="line">        <span class="comment">//pre[j-1] = pre[i] - k</span></span><br><span class="line">        <span class="comment">//if pre[j-1] exists , means pre[i] - pre[j-1] is k  . j ~ i is the subarray we want</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">sum</span> <span class="operator">=</span> <span class="number">0</span>,count = <span class="number">0</span>;</span><br><span class="line">        <span class="comment">//if sum == k need zero key</span></span><br><span class="line">        map.put(<span class="number">0</span>,<span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            sum+= nums[i];</span><br><span class="line">            <span class="keyword">if</span>(map.containsKey(sum-k))&#123;</span><br><span class="line">                count+=map.get(sum-k);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//the sum as key , occur times as value</span></span><br><span class="line">            map.put(sum,map.getOrDefault(sum,<span class="number">0</span>)+<span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> count;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(n)</p><hr>]]>
    </content>
    <id>https://jiarus.github.io/2025/03/25/LeetCode-02-%E6%95%B0%E7%BB%84-%E5%93%88%E5%B8%8C/</id>
    <link href="https://jiarus.github.io/2025/03/25/LeetCode-02-%E6%95%B0%E7%BB%84-%E5%93%88%E5%B8%8C/"/>
    <published>2025-03-25T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>🎯 LeetCode Hot 100</p>
</blockquote>
<hr>
<h2 id="1-两数之和"><a href="#1-两数之和" class="headerlink" title="1. 两数之和"></a>1. 两数之和</h2><p><strong>难度</strong>：简单 | <a href="https://leetcode.cn/problems/two-sum/">LeetCode 链接</a></p>
<p>给定数组 <code>nums</code> 和目标值 <code>target</code>，找出和为目标值的两个数的下标。</p>]]>
    </summary>
    <title>
      <![CDATA[02_数组 & 哈希]]>
    </title>
    <updated>2026-03-05T07:47:10.703Z</updated>
  </entry>
  <entry>
    <author>
      <name>Jiaru</name>
    </author>
    <category term="LeetCode" scheme="https://jiarus.github.io/categories/LeetCode/"/>
    <category term="LeetCode" scheme="https://jiarus.github.io/tags/LeetCode/"/>
    <category term="Hot100" scheme="https://jiarus.github.io/tags/Hot100/"/>
    <content>
      <![CDATA[<blockquote><p>🎯 LeetCode Hot 100</p></blockquote><hr><h2 id="283-移动零"><a href="#283-移动零" class="headerlink" title="283. 移动零"></a>283. 移动零</h2><p><strong>难度</strong>：简单 | <a href="https://leetcode.cn/problems/move-zeroes">LeetCode 链接</a></p><p>给定一个数组 <code>nums</code>，编写一个函数将所有 <code>0</code> 移动到数组的末尾，同时保持非零元素的相对顺序。</p><p>请注意 ，必须在不复制数组的情况下原地对数组进行操作。</p><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: nums = <span class="string">[0,1,0,3,12]</span></span><br><span class="line">输出: <span class="string">[1,3,12,0,0]</span></span><br></pre></td></tr></table></figure><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>用双指针，分别寻找非0和0元素，交换位置。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">moveZeroes</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> nums.length;</span><br><span class="line">        <span class="comment">//双指针</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> left=<span class="number">0</span>;left&lt;length;left++)&#123;</span><br><span class="line">            <span class="comment">//左指针寻找0</span></span><br><span class="line">            <span class="keyword">if</span>(nums[left] == <span class="number">0</span>)&#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">right</span> <span class="operator">=</span> left+<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">//右指针找到非0数，交换位置</span></span><br><span class="line">                <span class="keyword">while</span>(right&lt;length&amp;&amp;nums[right]==<span class="number">0</span>)&#123;</span><br><span class="line">                    right++;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">//防止right越界</span></span><br><span class="line">                <span class="keyword">if</span>(right&gt;=length)&#123;</span><br><span class="line">                    <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="type">int</span> <span class="variable">tmp</span> <span class="operator">=</span> nums[right];</span><br><span class="line">                nums[right] = nums[left];</span><br><span class="line">                nums[left] = tmp;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr><h2 id="11-盛最多水的容器"><a href="#11-盛最多水的容器" class="headerlink" title="11. 盛最多水的容器"></a>11. 盛最多水的容器</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/container-with-most-water/">LeetCode 链接</a></p><p>给定 n 个非负整数 <code>height</code>，每个数代表坐标中的一个点 <code>(i, height[i])</code>。找出两条线，使得它们与 x 轴构成的容器可以容纳最多的水。</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">输入：height = [<span class="number">1</span>,<span class="number">8</span>,<span class="number">6</span>,<span class="number">2</span>,<span class="number">5</span>,<span class="number">4</span>,<span class="number">8</span>,<span class="number">3</span>,<span class="number">7</span>]</span><br><span class="line">输出：<span class="number">49</span></span><br><span class="line">解释：选择 height[<span class="number">1</span>]=<span class="number">8</span> 和 height[<span class="number">8</span>]=<span class="number">7</span>，宽度为 <span class="number">7</span>，面积 = <span class="number">7</span> × <span class="number">7</span> = <span class="number">49</span></span><br></pre></td></tr></table></figure><p><img src="/../../images/question_11.jpg" alt="question_11.jpg"></p><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>双指针从两端向中间收缩，每次移动较短的那条边。</p><p><strong>为什么移动短边？</strong></p><ul><li>面积 &#x3D; <code>min(左高, 右高) × 宽度</code></li><li>宽度一定减小，要想面积可能变大，只能让高度变大</li><li>移动长边：<code>min</code> 值不变或变小，面积一定变小</li><li>移动短边：<code>min</code> 值可能变大，面积可能变大<br><img src="/images/container-water.webp" alt="双指针动图演示"></li><li>把左右指针看成x,y轴，图中是所有的组合，直接排除短边i&#x3D;0，可以跳过i&#x3D;0和j&#x3D;1~8的组合，以此类推。</li><li>利用空间缩减的思想：移动短边并不会漏掉最优解，目的是可以跳过一些不必要的计算。</li><li><a href="https://leetcode.cn/problems/container-with-most-water/solutions/94102/on-shuang-zhi-zhen-jie-fa-li-jie-zheng-que-xing-tu/?envType=study-plan-v2&envId=top-100-liked">详解见LeetCode</a></li></ul><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">maxArea</span><span class="params">(<span class="type">int</span>[] height)</span> &#123;</span><br><span class="line">        <span class="comment">//使用双指针</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>,r = height.length-<span class="number">1</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="comment">//比较l和r，移动height小的指针</span></span><br><span class="line">        <span class="keyword">while</span>(l&lt;r)&#123;</span><br><span class="line">            <span class="comment">//计算面积</span></span><br><span class="line">            <span class="type">int</span> <span class="variable">area</span> <span class="operator">=</span> (r-l)*Math.min(height[l],height[r]);</span><br><span class="line">            res = Math.max(res,area);</span><br><span class="line">            <span class="comment">//继续寻找</span></span><br><span class="line">            <span class="keyword">if</span>(height[l]&lt;height[r])&#123;</span><br><span class="line">                l++;</span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                r--;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(1)</p><hr><h2 id="15-三数之和"><a href="#15-三数之和" class="headerlink" title="15. 三数之和"></a>15. 三数之和</h2><p><strong>难度</strong>：中等 | <a href="https://leetcode.cn/problems/3sum/">LeetCode 链接</a></p><p>给定一个包含 <code>n</code> 个整数的数组 <code>nums</code>，判断 <code>nums</code> 中是否存在三个元素 <code>a, b, c</code> ，使得 <code>a + b + c = 0</code>。找出所有满足条件且不重复的三元组。</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：nums = [<span class="string">-1</span>,0,1,2,<span class="string">-1</span>,<span class="string">-4</span>]</span><br><span class="line">输出：[[<span class="string">-1</span>,<span class="string">-1</span>,2],[<span class="string">-1</span>,0,1]]</span><br></pre></td></tr></table></figure><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>先排序。固定一个数 <code>i</code>，对剩余区间用双指针 <code>l/r</code> 夹逼，按和的大小移动指针。注意跳过重复值</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> List&lt;List&lt;Integer&gt;&gt; <span class="title function_">threeSum</span><span class="params">(<span class="type">int</span>[] nums)</span> &#123;</span><br><span class="line">        List&lt;List&lt;Integer&gt;&gt; res = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="comment">//排序</span></span><br><span class="line">        Arrays.sort(nums);</span><br><span class="line">        <span class="comment">//遍历数组</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;i&lt;nums.length;i++)&#123;</span><br><span class="line">            <span class="comment">//去重</span></span><br><span class="line">            <span class="keyword">if</span>(i&gt;<span class="number">0</span>&amp;&amp;nums[i]==nums[i-<span class="number">1</span>])&#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">int</span> <span class="variable">target</span> <span class="operator">=</span> -nums[i];</span><br><span class="line">            <span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> i+<span class="number">1</span>,r=nums.length -<span class="number">1</span>;</span><br><span class="line">            <span class="keyword">while</span>(l&lt;r)&#123;</span><br><span class="line">                <span class="comment">//如果nums[l]+nums[r] = target</span></span><br><span class="line">                <span class="keyword">if</span>(nums[l]+nums[r] == target)&#123;</span><br><span class="line">                    res.add(Arrays.asList(nums[i],nums[l],nums[r]));</span><br><span class="line">                    <span class="comment">//继续寻找</span></span><br><span class="line">                    l++;</span><br><span class="line">                    r--;</span><br><span class="line">                    <span class="comment">//跳过重复元素</span></span><br><span class="line">                    <span class="keyword">while</span>(nums[l-<span class="number">1</span>]==nums[l]&amp;&amp;l&lt;r)&#123;</span><br><span class="line">                        l++;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">while</span>(nums[r+<span class="number">1</span>]==nums[r]&amp;&amp;l&lt;r)&#123;</span><br><span class="line">                        r--;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">continue</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">//如果nums[l]+nums[r] &lt; target l++</span></span><br><span class="line">                <span class="keyword">if</span>(nums[l]+nums[r] &lt; target)&#123;</span><br><span class="line">                    l++;</span><br><span class="line">                    <span class="keyword">continue</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">//如果nums[l]+nums[r] &gt; target r--</span></span><br><span class="line">                <span class="keyword">if</span>(nums[l]+nums[r] &gt; target)&#123;</span><br><span class="line">                    r--;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n²)，空间 O(1)</p><hr><h2 id="42-接雨水"><a href="#42-接雨水" class="headerlink" title="42. 接雨水"></a>42. 接雨水</h2><p><strong>难度</strong>：困难 | <a href="https://leetcode.cn/problems/trapping-rain-water/">LeetCode 链接</a></p><p>给定 <code>n</code> 个非负整数表示每个柱子的高度图，宽度均为 1，计算下雨之后能接多少雨水。</p><figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入：height = <span class="string">[4,2,0,3,2,5]</span></span><br><span class="line">输出：<span class="number">9</span></span><br></pre></td></tr></table></figure><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>双指针分别从两端向中间移动，并维护当前位置左侧&#x2F;右侧的最高高度 <code>leftMax</code> 和 <code>rightMax</code>。当前列可以接的水量由更矮一侧的最高高度决定，因此移动较低的一侧指针并累加水量，整体只需一次遍历。<br><img src="/../../images/rainwatertrap.png" alt="rainwatertrap.png"></p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">trap</span><span class="params">(<span class="type">int</span>[] height)</span> &#123;</span><br><span class="line">        <span class="comment">//关键：下标 i 处能接的雨水量由 leftMax[i]（左指针走到i过程中发现的最大值） 和 rightMax[i] 中的最小值决定。</span></span><br><span class="line">        <span class="comment">//方法1：创建前缀最大值数组+后缀最大值数组，存放i从左到右、从右到左的最大值 (空间复杂度O(n))</span></span><br><span class="line">        <span class="type">int</span> preMax[] = <span class="keyword">new</span> <span class="title class_">int</span>[height.length];</span><br><span class="line">        preMax[<span class="number">0</span>] = height[<span class="number">0</span>];</span><br><span class="line">        <span class="comment">//计算前缀最大值</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;height.length;i++)&#123;</span><br><span class="line">            preMax[i] = Math.max(preMax[i-<span class="number">1</span>],height[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//计算后缀最大值</span></span><br><span class="line">        <span class="type">int</span> sufMax[] = <span class="keyword">new</span> <span class="title class_">int</span>[height.length];</span><br><span class="line">        sufMax[height.length-<span class="number">1</span>] = height[height.length-<span class="number">1</span>];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=height.length-<span class="number">2</span>;i&gt;=<span class="number">0</span>;i--)&#123;</span><br><span class="line">            sufMax[i] = Math.max(sufMax[i+<span class="number">1</span>],height[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//计算结果</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;height.length;i++)&#123;</span><br><span class="line">            ans += Math.min(preMax[i],sufMax[i]) - height[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// //方法2：双指针(空间复杂度O(1))</span></span><br><span class="line">        <span class="comment">// //分别计算前缀和后缀，需要额外的存储空间，如果不使用额外的空间，可以只记录当前左边最大，右边最大，并实时更新。</span></span><br><span class="line">        <span class="comment">// //移动小边的指针原因：大边的最大值已经确定，小边的值可能会增大，可能会接到更多雨水</span></span><br><span class="line">        <span class="comment">// int leftMax =0,rightMax = 0;</span></span><br><span class="line">        <span class="comment">// int l=0,r=height.length-1;</span></span><br><span class="line">        <span class="comment">// int ans = 0;</span></span><br><span class="line">        <span class="comment">// while(l&lt;r)&#123;</span></span><br><span class="line">        <span class="comment">//     //判断哪边小</span></span><br><span class="line">        <span class="comment">//     //更新最大值</span></span><br><span class="line">        <span class="comment">//      leftMax = Math.max(leftMax,height[l]);</span></span><br><span class="line">        <span class="comment">//      rightMax = Math.max(rightMax,height[r]);</span></span><br><span class="line">        <span class="comment">//    if(leftMax&lt;=rightMax)&#123;</span></span><br><span class="line">        <span class="comment">//      //计算雨水</span></span><br><span class="line">        <span class="comment">//      ans+=leftMax-height[l];</span></span><br><span class="line">        <span class="comment">//      l++;</span></span><br><span class="line">        <span class="comment">//    &#125;else&#123;</span></span><br><span class="line">        <span class="comment">//      //计算雨水</span></span><br><span class="line">        <span class="comment">//      ans+=rightMax-height[r];</span></span><br><span class="line">        <span class="comment">//      r--;</span></span><br><span class="line">        <span class="comment">//    &#125;</span></span><br><span class="line">        <span class="comment">// &#125;</span></span><br><span class="line">        <span class="comment">// return ans;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>复杂度</strong>：时间 O(n)，空间 O(n) 或 O(1)</p><hr>]]>
    </content>
    <id>https://jiarus.github.io/2025/02/27/LeetCode-01-%E5%8F%8C%E6%8C%87%E9%92%88/</id>
    <link href="https://jiarus.github.io/2025/02/27/LeetCode-01-%E5%8F%8C%E6%8C%87%E9%92%88/"/>
    <published>2025-02-27T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>🎯 LeetCode Hot 100</p>
</blockquote>
<hr>
<h2 id="283-移动零"><a href="#283-移动零" class="headerlink" title="283. 移动零"></a>283. 移动零</h2><p><strong>难度</strong>：简单 | <a href="https://leetcode.cn/problems/move-zeroes">LeetCode 链接</a></p>
<p>给定一个数组 <code>nums</code>，编写一个函数将所有 <code>0</code> 移动到数组的末尾，同时保持非零元素的相对顺序。</p>]]>
    </summary>
    <title>01_双指针</title>
    <updated>2026-03-05T07:46:35.228Z</updated>
  </entry>
</feed>
