<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>常想一二，不思八九</title>
  <icon>https://even629.com/icon.png</icon>
  <subtitle>blog</subtitle>
  <link href="https://even629.com/atom.xml" rel="self"/>
  
  <link href="https://even629.com/"/>
  <updated>2026-03-25T02:28:13.000Z</updated>
  <id>https://even629.com/</id>
  
  <author>
    <name>even629</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>leetcode每日一题 P3546 等和矩阵分割 I</title>
    <link href="https://even629.com/posts/3546/"/>
    <id>https://even629.com/posts/3546/</id>
    <published>2026-03-25T02:28:13.000Z</published>
    <updated>2026-03-25T02:28:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-25</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P3546 等和矩阵分割 I" href="https://leetcode.cn/problems/equal-sum-grid-partition-i/description/?envType=daily-question&envId=2026-03-25"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P3546 等和矩阵分割 I</p><p class="url">https://leetcode.cn/problems/equal-sum-grid-partition-i/description/?envType=daily-question&envId=2026-03-25</p></div></a></div><p>前缀和换皮题目，注意相加时可能超过int表示的最大值</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">bool</span> <span class="title">canPartitionGrid</span><span class="params">(vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; &amp;grid)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="comment">// 1 &lt;= m == grid.length &lt;= 105</span></span><br><span class="line">                <span class="comment">// 1 &lt;= n == grid[i].length &lt;= 105</span></span><br><span class="line">                <span class="comment">// 2 &lt;= m * n &lt;= 105</span></span><br><span class="line">                <span class="comment">// 1 &lt;= grid[i][j] &lt;= 105</span></span><br><span class="line">                <span class="type">int</span> i, j, m = grid.<span class="built_in">size</span>(), n = grid[<span class="number">0</span>].<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> total = m * n;</span><br><span class="line">                <span class="type">long</span> last;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">long</span>&gt; <span class="title">prefix_sum</span><span class="params">(total, <span class="number">0</span>)</span></span>;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">long</span>&gt; <span class="title">suffix_sum</span><span class="params">(total, <span class="number">0</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 水平分割</span></span><br><span class="line">                last = grid[<span class="number">0</span>][<span class="number">0</span>];</span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == <span class="number">0</span> &amp;&amp; j == <span class="number">0</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line">                                prefix_sum[i * n + j] = last + prefix_sum[i * n + j - <span class="number">1</span>];</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                last = grid[m - <span class="number">1</span>][n - <span class="number">1</span>];</span><br><span class="line">                <span class="keyword">for</span> (i = m - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = n - <span class="number">1</span>; j &gt;= <span class="number">0</span>; j--) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == m - <span class="number">1</span> &amp;&amp; j == n - <span class="number">1</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line">                                suffix_sum[i * n + j] = last + suffix_sum[i * n + j + <span class="number">1</span>];</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m - <span class="number">1</span>; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (prefix_sum[i * n + n - <span class="number">1</span>] + grid[i][n - <span class="number">1</span>] == suffix_sum[i * n + n - <span class="number">1</span>])</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"></span><br><span class="line">                <span class="comment">// 垂直分割</span></span><br><span class="line">                prefix_sum[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line">                last = grid[<span class="number">0</span>][<span class="number">0</span>];</span><br><span class="line">                <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == <span class="number">0</span> &amp;&amp; j == <span class="number">0</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line">                                prefix_sum[j * m + i] = last + prefix_sum[j * m + i - <span class="number">1</span>];</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                suffix_sum[total - <span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line">                last = grid[m - <span class="number">1</span>][n - <span class="number">1</span>];</span><br><span class="line">                <span class="keyword">for</span> (j = n - <span class="number">1</span>; j &gt;= <span class="number">0</span>; j--) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (i = m - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == m - <span class="number">1</span> &amp;&amp; j == n - <span class="number">1</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line">                                suffix_sum[j * m + i] = last + suffix_sum[j * m + i + <span class="number">1</span>];</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">for</span> (j = <span class="number">1</span>; j &lt; n; j++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (prefix_sum[j * m] == suffix_sum[j * m] + grid[<span class="number">0</span>][j])</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"></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></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">前缀和</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="leetcode每日一题" scheme="https://even629.com/tags/leetcode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98/"/>
    
    <category term="前缀和" scheme="https://even629.com/tags/%E5%89%8D%E7%BC%80%E5%92%8C/"/>
    
  </entry>
  
  <entry>
    <title>leetcode每日一题 P2906 构造乘积矩阵</title>
    <link href="https://even629.com/posts/2906/"/>
    <id>https://even629.com/posts/2906/</id>
    <published>2026-03-24T09:01:13.000Z</published>
    <updated>2026-03-24T09:01:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-24</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P2906 构造乘积矩阵" href="https://leetcode.cn/problems/construct-product-matrix/description/?envType=daily-question&envId=2026-03-24"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P2906 构造乘积矩阵</p><p class="url">https://leetcode.cn/problems/construct-product-matrix/description/?envType=daily-question&envId=2026-03-24</p></div></a></div><p>前缀和换皮题目，注意相乘时可能超过int表示的最大值</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MODULO_NUM 12345</span></span><br><span class="line"></span><br><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><br><span class="line">        vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">constructProductMatrix</span>(vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; &amp;grid)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="comment">// 1 &lt;= n == grid.length &lt;= 105</span></span><br><span class="line">                <span class="comment">// 1 &lt;= m == grid[i].length &lt;= 105</span></span><br><span class="line">                <span class="comment">// 2 &lt;= n * m &lt;= 105</span></span><br><span class="line">                <span class="comment">// 1 &lt;= grid[i][j] &lt;= 109</span></span><br><span class="line">                <span class="type">int</span> i, j, m = grid.<span class="built_in">size</span>(), n = grid[<span class="number">0</span>].<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> total = m * n, last;</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">product_matrix</span>(m, (<span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(n, <span class="number">0</span>)));</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">prefix_product</span><span class="params">(total, <span class="number">1</span>)</span></span>;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">suffix_product</span><span class="params">(total, <span class="number">1</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// prefix</span></span><br><span class="line">                last = grid[<span class="number">0</span>][<span class="number">0</span>];</span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == <span class="number">0</span> &amp;&amp; j == <span class="number">0</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line">                                prefix_product[i * n + j] =</span><br><span class="line">                                        (<span class="type">long</span>)((<span class="type">long</span>)last * (<span class="type">long</span>)prefix_product[i * n + j - <span class="number">1</span>]) %</span><br><span class="line">                                        MODULO_NUM;</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">// suffix</span></span><br><span class="line">                last = grid[m - <span class="number">1</span>][n - <span class="number">1</span>];</span><br><span class="line">                <span class="keyword">for</span> (i = m - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = n - <span class="number">1</span>; j &gt;= <span class="number">0</span>; j--) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i == m - <span class="number">1</span> &amp;&amp; j == n - <span class="number">1</span>)</span><br><span class="line">                                        <span class="keyword">continue</span>;</span><br><span class="line">                                suffix_product[i * n + j] =</span><br><span class="line">                                        (<span class="type">long</span>)((<span class="type">long</span>)last * (<span class="type">long</span>)suffix_product[i * n + j + <span class="number">1</span>]) %</span><br><span class="line">                                        MODULO_NUM;</span><br><span class="line">                                last = grid[i][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                                product_matrix[i][j] = (<span class="type">long</span>)((<span class="type">long</span>)prefix_product[i * n + j] *</span><br><span class="line">                                                              (<span class="type">long</span>)suffix_product[i * n + j]) %</span><br><span class="line">                                                       MODULO_NUM;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> product_matrix;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">前缀和</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="leetcode每日一题" scheme="https://even629.com/tags/leetcode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98/"/>
    
    <category term="前缀和" scheme="https://even629.com/tags/%E5%89%8D%E7%BC%80%E5%92%8C/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P1143 最长公共子序列</title>
    <link href="https://even629.com/posts/1143/"/>
    <id>https://even629.com/posts/1143/</id>
    <published>2026-03-21T09:09:13.000Z</published>
    <updated>2026-03-21T09:09:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-21</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P1143 最长公共子序列" href="https://leetcode.cn/problems/longest-common-subsequence/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P1143 最长公共子序列</p><p class="url">https://leetcode.cn/problems/longest-common-subsequence/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>经典问题了，<code>dp[i][j]</code> 表示 <code>text1[0..=i]</code> 和 <code>text2[0..=j]</code> 的最长公共子序列长度，状态转移方程为</p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>e</mi><mi>x</mi><mi>t</mi><mn>1</mn><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo>=</mo><mo>=</mo><mi>t</mi><mi>e</mi><mi>x</mi><mi>t</mi><mn>2</mn><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex"> text1[i] == text2[j] </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mord mathnormal">t</span><span class="mord">1</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">==</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mord mathnormal">t</span><span class="mord">2</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 时：<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mi>p</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>=</mo><mi>d</mi><mi>p</mi><mo stretchy="false">[</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex"> dp[i][j] = dp[i-1][j-1] + 1 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></li></ul></li><li>otherwise:<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mi>p</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>=</mo><mi>m</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><mi>d</mi><mi>p</mi><mo stretchy="false">[</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><mi>d</mi><mi>p</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> dp[i][j] = max(dp[i-1][j], dp[i][j-1]) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">])</span></span></span></span></li></ul></li></ul><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">longestCommonSubsequence</span><span class="params">(string text1, string text2)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j, n1 = text<span class="number">1.</span><span class="built_in">size</span>(), n2 = text<span class="number">2.</span><span class="built_in">size</span>();</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">dp</span>(n1, <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(n2, <span class="number">0</span>));</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n1; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (text1[i] == text2[<span class="number">0</span>]) &#123;</span><br><span class="line">                                <span class="keyword">while</span> (i &lt; n1)</span><br><span class="line">                                        dp[i++][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n2; j++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (text2[j] == text1[<span class="number">0</span>]) &#123;</span><br><span class="line">                                <span class="keyword">while</span> (j &lt; n2)</span><br><span class="line">                                        dp[<span class="number">0</span>][j++] = <span class="number">1</span>;</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// dp[i][j] 表示 text1[0..=i] 和 text2[0..=j] 的最长公共子序列长度</span></span><br><span class="line"></span><br><span class="line">                <span class="comment">// dp[i][j] = dp[i-1][j-1] + 1 (text1[i] == text2[j])</span></span><br><span class="line">                <span class="comment">// dp[i][j] = max(dp[i-1][j], dp[i][j-1])</span></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; n1; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">1</span>; j &lt; n2; j++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (text1[i] == text2[j])</span><br><span class="line">                                        dp[i][j] = dp[i - <span class="number">1</span>][j - <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        dp[i][j] = std::<span class="built_in">max</span>(dp[i - <span class="number">1</span>][j], dp[i][j - <span class="number">1</span>]);</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> dp[n1 - <span class="number">1</span>][n2 - <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P62 不同路径</title>
    <link href="https://even629.com/posts/62/"/>
    <id>https://even629.com/posts/62/</id>
    <published>2026-03-21T07:15:13.000Z</published>
    <updated>2026-03-21T07:15:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-21</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P62 不同路径" href="https://leetcode.cn/problems/unique-paths/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P62 不同路径</p><p class="url">https://leetcode.cn/problems/unique-paths/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>动态规划</p><figure class="highlight c++"><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="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">uniquePaths</span><span class="params">(<span class="type">int</span> m, <span class="type">int</span> n)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j;</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">dp</span>(m, <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(n, <span class="number">0</span>));</span><br><span class="line">                <span class="comment">// dp[i][j] 表示到(i,j)的不同路径总数</span></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; m; i++)</span><br><span class="line">                        dp[i][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++)</span><br><span class="line">                        dp[<span class="number">0</span>][j] = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; m; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">1</span>; j &lt; n; j++)</span><br><span class="line">                                dp[i][j] = dp[i - <span class="number">1</span>][j] + dp[i][j - <span class="number">1</span>];</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> dp[m - <span class="number">1</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><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P32 最长有效括号</title>
    <link href="https://even629.com/posts/32/"/>
    <id>https://even629.com/posts/32/</id>
    <published>2026-03-21T06:22:13.000Z</published>
    <updated>2026-03-21T06:22:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-21</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P416 分割等和子集" href="https://leetcode.cn/problems/longest-valid-parentheses/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P416 分割等和子集</p><p class="url">https://leetcode.cn/problems/longest-valid-parentheses/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><ul><li>用栈模拟一遍，将所有无法匹配的括号的位置全部置1,<ul><li>例如: <code>()(()</code> 的mark为[0, 0, 1, 0, 0]</li><li>再例如: <code>)()((())</code> 的mark为[1, 0, 0, 1, 0, 0, 0, 0]</li></ul></li><li>经过这样的处理后, 此题就变成了<strong>寻找最长的连续的0的长度</strong></li></ul><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stack&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::stack;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">longestValidParentheses</span><span class="params">(string s)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j, n = s.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> max_len = <span class="number">0</span>;</span><br><span class="line">                stack&lt;<span class="type">int</span>&gt; stk;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">arr</span><span class="params">(n, <span class="number">0</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (s[i] == <span class="string">&#x27;(&#x27;</span>) &#123;</span><br><span class="line">                                stk.<span class="built_in">push</span>(i);</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                <span class="keyword">if</span> (stk.<span class="built_in">empty</span>())</span><br><span class="line">                                        arr[i] = <span class="number">1</span>;</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        stk.<span class="built_in">pop</span>();</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">while</span> (!stk.<span class="built_in">empty</span>()) &#123; <span class="comment">//未匹配的括号</span></span><br><span class="line">                        arr[stk.<span class="built_in">top</span>()] = <span class="number">1</span>;</span><br><span class="line">                        stk.<span class="built_in">pop</span>();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">// 找最长连续为0</span></span><br><span class="line">                i = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">while</span> (i &lt; n) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (arr[i] == <span class="number">0</span>) &#123;</span><br><span class="line">                                j = i;</span><br><span class="line"></span><br><span class="line">                                <span class="keyword">while</span> (j &lt; n &amp;&amp; arr[j] == <span class="number">0</span>)</span><br><span class="line">                                        j++;</span><br><span class="line"></span><br><span class="line">                                max_len = std::<span class="built_in">max</span>(max_len, j - i);</span><br><span class="line">                                i = j + <span class="number">1</span>;</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                i++;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> max_len;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划，栈</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="栈" scheme="https://even629.com/tags/%E6%A0%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P416 分割等和子集</title>
    <link href="https://even629.com/posts/416/"/>
    <id>https://even629.com/posts/416/</id>
    <published>2026-03-21T04:06:13.000Z</published>
    <updated>2026-03-21T04:06:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-21</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P416 分割等和子集" href="https://leetcode.cn/problems/partition-equal-subset-sum/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P416 分割等和子集</p><p class="url">https://leetcode.cn/problems/partition-equal-subset-sum/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>将子数组求和，然后将和除以2，转化找到数组一个子集为总和的一半，即为 0-1 背包问题</p><p>dp[i][j] 表示从数组的 [0,i] 下标范围内选取若干个正整数（可以是 0 个），是否存在一种选取方案使得被选取的正整数的和等于 j。初始时，dp 中的全部元素都是 false。</p><p>初始化：</p><ul><li>如果不选取任何正整数，则被选取的正整数之和等于 0。因此对于所有 0 ≤ i &lt; n，都有 dp[i][0]=true。</li><li>当 i==0 时，只有一个正整数 nums[0] 可以被选取，因此 dp[0]nums[0]]=true。</li></ul><p>状态转移：</p><ul><li><code>dp[i][j] = dp[i−1][j] ∣ dp[i−1][j−nums[i]]</code> (j &gt;= nums[i])</li><li><code>dp[i][j] = dp[i-1][j]</code> (j &lt; nums[i])</li></ul><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">bool</span> <span class="title">canPartition</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j, n = nums.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> sum = <span class="number">0</span>, target;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">                        sum += nums[i];</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (sum % <span class="number">2</span> != <span class="number">0</span>) <span class="comment">// 奇数</span></span><br><span class="line">                        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">                target = sum / <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++) &#123; <span class="comment">// 有一个数超过总和的一半</span></span><br><span class="line">                        <span class="keyword">if</span> (nums[<span class="number">0</span>] &gt; target)</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"></span><br><span class="line">                <span class="comment">// 0-1 背包问题</span></span><br><span class="line">                <span class="comment">// dp[i][j] 表示从数组的 [0,i] 下标范围内选取若干个正整数（可以是 0 个）</span></span><br><span class="line">                <span class="comment">// 是否存在一种选取方案使得被选取的正整数的和等于 j。初始时，dp 中的全部元素都是 false。</span></span><br><span class="line">                vector&lt;vector&lt;<span class="type">bool</span>&gt; &gt; <span class="built_in">dp</span>(n, <span class="built_in">vector</span>&lt;<span class="type">bool</span>&gt;(target + <span class="number">1</span>, <span class="literal">false</span>));</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 如果不选取任何正整数，则被选取的正整数之和等于 0。因此对于所有 0 ≤ i &lt; n，都有 dp[i][0]=true。</span></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">                        dp[i][<span class="number">0</span>] = <span class="literal">true</span>;</span><br><span class="line">                <span class="comment">// 当 i==0 时，只有一个正整数 nums[0] 可以被选取，因此 dp[0][nums[0]]=true。</span></span><br><span class="line">                dp[<span class="number">0</span>][nums[<span class="number">0</span>]] = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// dp[i][j] = dp[i−1][j] ∣ dp[i−1][j−nums[i]] (j &gt;= nums[i])</span></span><br><span class="line">                <span class="comment">// dp[i][j] = dp[i-1][j] (j &lt; nums[i])</span></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; n; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">1</span>; j &lt;= target; j++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (j &gt;= nums[i])</span><br><span class="line">                                        dp[i][j] = dp[i - <span class="number">1</span>][j] | dp[i - <span class="number">1</span>][j - nums[i]];</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        dp[i][j] = dp[i - <span class="number">1</span>][j];</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> dp[n - <span class="number">1</span>][target];</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
    <category term="0-1背包问题" scheme="https://even629.com/tags/0-1%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P152 乘积最大子数组</title>
    <link href="https://even629.com/posts/152/"/>
    <id>https://even629.com/posts/152/</id>
    <published>2026-03-21T02:44:13.000Z</published>
    <updated>2026-03-21T02:44:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-21</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P152 乘积最大子数组" href="https://leetcode.cn/problems/maximum-product-subarray/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P152 乘积最大子数组</p><p class="url">https://leetcode.cn/problems/maximum-product-subarray/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">maxProduct</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, n = nums.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> max_val = nums[<span class="number">0</span>];</span><br><span class="line">                <span class="comment">// dp[i][0] 表示以nums[i]结尾的 乘积最大的非空连续 子数组</span></span><br><span class="line">                <span class="comment">// dp[i][1] 表示以nums[i]结尾的 乘积最小的非空连续 子数组</span></span><br><span class="line">                <span class="comment">// dp[i][0] = max&#123; dp[i-1][0] * nums[i],dp[i-1][1] *nums[i] , nums[i]&#125;</span></span><br><span class="line">                <span class="comment">// dp[i][1] = min&#123; dp[i-1][0] * nums[i],dp[i-1][1] *nums[i] , nums[i]&#125;</span></span><br><span class="line"></span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">dp</span>(n, <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(<span class="number">2</span>));</span><br><span class="line"></span><br><span class="line">                dp[<span class="number">0</span>][<span class="number">0</span>] = nums[<span class="number">0</span>];</span><br><span class="line">                dp[<span class="number">0</span>][<span class="number">1</span>] = nums[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; n; i++) &#123;</span><br><span class="line">                        dp[i][<span class="number">0</span>] = std::<span class="built_in">max</span>(</span><br><span class="line">                                &#123; dp[i - <span class="number">1</span>][<span class="number">0</span>] * nums[i], dp[i - <span class="number">1</span>][<span class="number">1</span>] * nums[i], nums[i] &#125;);</span><br><span class="line">                        dp[i][<span class="number">1</span>] = std::<span class="built_in">min</span>(</span><br><span class="line">                                &#123; dp[i - <span class="number">1</span>][<span class="number">0</span>] * nums[i], dp[i - <span class="number">1</span>][<span class="number">1</span>] * nums[i], nums[i] &#125;);</span><br><span class="line">                        max_val = std::<span class="built_in">max</span>(max_val, dp[i][<span class="number">0</span>]);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> max_val;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P279 完全平方数</title>
    <link href="https://even629.com/posts/279/"/>
    <id>https://even629.com/posts/279/</id>
    <published>2026-03-20T13:17:13.000Z</published>
    <updated>2026-03-20T13:17:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-20</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P279 完全平方数" href="https://leetcode.cn/problems/perfect-squares/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P279 完全平方数</p><p class="url">https://leetcode.cn/problems/perfect-squares/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>动态规划</p><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">numSquares</span><span class="params">(<span class="type">int</span> n)</span> <span class="comment">// 12</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; perfect_squares;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">dp</span><span class="params">(n + <span class="number">1</span>, n + <span class="number">1</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i * i &lt;= n; i++)</span><br><span class="line">                        perfect_squares.<span class="built_in">push_back</span>(i * i); <span class="comment">// 1 4 9</span></span><br><span class="line"></span><br><span class="line">                dp[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; perfect_squares.<span class="built_in">size</span>() &amp;&amp; perfect_squares[j] &lt;= i; j++)</span><br><span class="line">                                dp[i] = std::<span class="built_in">min</span>(dp[i], dp[i - perfect_squares[j]] + <span class="number">1</span>);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> dp[n];</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">        Solution S;</span><br><span class="line">        <span class="type">int</span> num = S.<span class="built_in">numSquares</span>(<span class="number">12</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>, num);</span><br><span class="line">        num = S.<span class="built_in">numSquares</span>(<span class="number">13</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>, num);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P118 杨辉三角</title>
    <link href="https://even629.com/posts/118/"/>
    <id>https://even629.com/posts/118/</id>
    <published>2026-03-20T10:43:13.000Z</published>
    <updated>2026-03-20T10:43:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-20</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P118 杨辉三角" href="https://leetcode.cn/problems/pascals-triangle/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P118 杨辉三角</p><p class="url">https://leetcode.cn/problems/pascals-triangle/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">generate</span>(<span class="type">int</span> numRows)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> i, j, n;</span><br><span class="line">                <span class="type">int</span> last = <span class="number">0</span>;</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; res;</span><br><span class="line"></span><br><span class="line">                res.<span class="built_in">push_back</span>(&#123; <span class="number">1</span> &#125;);</span><br><span class="line">                <span class="keyword">if</span> (numRows == <span class="number">1</span>)</span><br><span class="line">                        <span class="keyword">return</span> res;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; numRows; i++) &#123;</span><br><span class="line">                        vector&lt;<span class="type">int</span>&gt; &amp;last_line = res.<span class="built_in">back</span>();</span><br><span class="line">                        vector&lt;<span class="type">int</span>&gt; curr;</span><br><span class="line"></span><br><span class="line">                        last = <span class="number">0</span>;</span><br><span class="line">                        n = last_line.<span class="built_in">size</span>();</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                                curr.<span class="built_in">push_back</span>(last_line[j] + last);</span><br><span class="line">                                last = last_line[j];</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        curr.<span class="built_in">push_back</span>(<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                        res.<span class="built_in">push_back</span>(curr);</span><br><span class="line">                &#125;</span><br><span class="line"></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><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P763 划分字母区间</title>
    <link href="https://even629.com/posts/763/"/>
    <id>https://even629.com/posts/763/</id>
    <published>2026-03-20T07:00:13.000Z</published>
    <updated>2026-03-20T07:00:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-20</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P763 划分字母区间" href="https://leetcode.cn/problems/partition-labels/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P763 划分字母区间</p><p class="url">https://leetcode.cn/problems/partition-labels/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>BFS 的做法：</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;queue&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"><span class="keyword">using</span> std::queue;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">partitionLabels</span><span class="params">(string s)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="comment">// 1 &lt;= s.length &lt;= 500</span></span><br><span class="line">                <span class="comment">// s 仅由小写英文字母组成</span></span><br><span class="line">                <span class="type">int</span> i, n = s.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> start = <span class="number">0</span>;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; res;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">last_showed_pos</span><span class="params">(<span class="number">26</span>, <span class="number">-1</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123; <span class="comment">// 每个字母最后一次出现的位置</span></span><br><span class="line">                        <span class="keyword">if</span> (last_showed_pos[s[i] - <span class="string">&#x27;a&#x27;</span>] == <span class="number">-1</span>)</span><br><span class="line">                                last_showed_pos[s[i] - <span class="string">&#x27;a&#x27;</span>] = i;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> (start &lt; n) &#123;</span><br><span class="line">                        queue&lt;<span class="type">char</span>&gt; que;</span><br><span class="line">                        <span class="function">vector&lt;<span class="type">bool</span>&gt; <span class="title">visited</span><span class="params">(<span class="number">26</span>, <span class="literal">false</span>)</span></span>;</span><br><span class="line">                        <span class="type">int</span> len = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">                        que.<span class="built_in">push</span>(s[start]);</span><br><span class="line">                        visited[s[start] - <span class="string">&#x27;a&#x27;</span>] = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">while</span> (!que.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">                                <span class="type">char</span> ch = que.<span class="built_in">front</span>();</span><br><span class="line">                                que.<span class="built_in">pop</span>();</span><br><span class="line"></span><br><span class="line">                                <span class="type">int</span> boundary = last_showed_pos[ch - <span class="string">&#x27;a&#x27;</span>];</span><br><span class="line"></span><br><span class="line">                                len = std::<span class="built_in">max</span>(len, boundary - start + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt;= boundary; i++) &#123;</span><br><span class="line">                                        <span class="keyword">if</span> (!visited[s[i] - <span class="string">&#x27;a&#x27;</span>]) &#123;</span><br><span class="line">                                                que.<span class="built_in">push</span>(s[i]);</span><br><span class="line">                                                visited[s[i] - <span class="string">&#x27;a&#x27;</span>] = <span class="literal">true</span>;</span><br><span class="line">                                        &#125;</span><br><span class="line">                                &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                        res.<span class="built_in">push_back</span>(len);</span><br><span class="line">                        start = start + len;</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><span class="line"></span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">贪心</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="贪心" scheme="https://even629.com/tags/%E8%B4%AA%E5%BF%83/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P347 前 K 个高频元素</title>
    <link href="https://even629.com/posts/347/"/>
    <id>https://even629.com/posts/347/</id>
    <published>2026-03-19T02:44:13.000Z</published>
    <updated>2026-03-19T02:44:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-19</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P347 前 K 个高频元素" href="https://leetcode.cn/problems/top-k-frequent-elements/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P347 前 K 个高频元素</p><p class="url">https://leetcode.cn/problems/top-k-frequent-elements/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>大顶堆</p><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;utility&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::unordered_map;</span><br><span class="line"><span class="keyword">using</span> std::priority_queue;</span><br><span class="line"><span class="keyword">using</span> std::pair;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">topKFrequent</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums, <span class="type">int</span> k)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; res;</span><br><span class="line">                unordered_map&lt;<span class="type">int</span>, <span class="type">int</span>&gt; umap;</span><br><span class="line">                priority_queue&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;, vector&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; &gt;, std::less&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; &gt; &gt;</span><br><span class="line">                        max_heap;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> val : nums)</span><br><span class="line">                        umap[val]++;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">auto</span> [val, times] : umap)</span><br><span class="line">                        max_heap.<span class="built_in">push</span>(&#123; times, val &#125;);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> (k &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                        res.<span class="built_in">push_back</span>(max_heap.<span class="built_in">top</span>().second);</span><br><span class="line">                        max_heap.<span class="built_in">pop</span>();</span><br><span class="line">                        k--;</span><br><span class="line">                &#125;</span><br><span class="line"></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>实际上最优解是用快速排序：</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;utility&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::pair;</span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::unordered_map;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">private</span>:</span><br><span class="line">        <span class="function"><span class="type">void</span> <span class="title">quick_sort</span><span class="params">(vector&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; &gt; &amp;arr, <span class="type">int</span> k, <span class="type">int</span> start, <span class="type">int</span> end)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="keyword">if</span> (start &gt;= end)</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                <span class="type">int</span> pivot = arr[(start + end) / <span class="number">2</span>].first;</span><br><span class="line">                <span class="type">int</span> left = start - <span class="number">1</span>;</span><br><span class="line">                <span class="type">int</span> right = end + <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> (left &lt; right) &#123;</span><br><span class="line">                        <span class="keyword">do</span> &#123;</span><br><span class="line">                                left++;</span><br><span class="line">                        &#125; <span class="keyword">while</span> (arr[left].first &gt; pivot);</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">do</span> &#123;</span><br><span class="line">                                right--;</span><br><span class="line">                        &#125; <span class="keyword">while</span> (arr[right].first &lt; pivot);</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">if</span> (left &lt; right)</span><br><span class="line">                                std::<span class="built_in">swap</span>(arr[left], arr[right]);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// start ..=right, right+1..=end</span></span><br><span class="line">                <span class="keyword">if</span> (k &lt;= right)</span><br><span class="line">                        <span class="built_in">quick_sort</span>(arr, k, start, right);</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                        <span class="built_in">quick_sort</span>(arr, k, right + <span class="number">1</span>, end);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">topKFrequent</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums, <span class="type">int</span> k)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i;</span><br><span class="line">                vector&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; &gt; arr;</span><br><span class="line">                unordered_map&lt;<span class="type">int</span>, <span class="type">int</span>&gt; umap;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; res;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> val : nums)</span><br><span class="line">                        umap[val]++;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">auto</span> [val, times] : umap)</span><br><span class="line">                        arr.<span class="built_in">push_back</span>(&#123; times, val &#125;);</span><br><span class="line"></span><br><span class="line">                <span class="built_in">quick_sort</span>(arr, k, <span class="number">0</span>, arr.<span class="built_in">size</span>() - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; k; i++)</span><br><span class="line">                        res.<span class="built_in">push_back</span>(arr[i].second);</span><br><span class="line"></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><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">堆</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="堆" scheme="https://even629.com/tags/%E5%A0%86/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P84 柱状图中的最大矩形</title>
    <link href="https://even629.com/posts/84/"/>
    <id>https://even629.com/posts/84/</id>
    <published>2026-03-18T10:40:13.000Z</published>
    <updated>2026-03-18T10:40:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-18</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P84 柱状图中的最大矩形" href="https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P84 柱状图中的最大矩形</p><p class="url">https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>这个案例是经典单调栈的场景，仔细想这道题，无非也是找到最左边第一个低于自己的矩形，和最右边第一个低于自己的矩形，其实这是经典The Next Greater问题</p><figure class="highlight c++"><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="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::stack;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">largestRectangleArea</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;heights)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, n = heights.<span class="built_in">size</span>(), max_area = <span class="number">0</span>;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">left</span><span class="params">(n, <span class="number">0</span>)</span></span>;</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">right</span><span class="params">(n, n - <span class="number">1</span>)</span></span>;</span><br><span class="line">                stack&lt;<span class="type">int</span>&gt; stk1, stk2;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">                        <span class="keyword">while</span> (!stk<span class="number">1.</span><span class="built_in">empty</span>() &amp;&amp; heights[i] &lt; heights[stk<span class="number">1.</span><span class="built_in">top</span>()]) &#123;</span><br><span class="line">                                right[stk<span class="number">1.</span><span class="built_in">top</span>()] = i - <span class="number">1</span>; <span class="comment">// 右边界</span></span><br><span class="line">                                stk<span class="number">1.</span><span class="built_in">pop</span>();</span><br><span class="line">                        &#125;</span><br><span class="line">                        stk<span class="number">1.</span><span class="built_in">push</span>(i);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// while (!stk.empty()) &#123;</span></span><br><span class="line">                <span class="comment">//         right[stk.top()] = n - 1;</span></span><br><span class="line">                <span class="comment">// &#125;</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                        <span class="keyword">while</span> (!stk<span class="number">2.</span><span class="built_in">empty</span>() &amp;&amp; heights[i] &lt; heights[stk<span class="number">2.</span><span class="built_in">top</span>()]) &#123;</span><br><span class="line">                                left[stk<span class="number">2.</span><span class="built_in">top</span>()] = i + <span class="number">1</span>; <span class="comment">// 左边界</span></span><br><span class="line">                                stk<span class="number">2.</span><span class="built_in">pop</span>();</span><br><span class="line">                        &#125;</span><br><span class="line">                        stk<span class="number">2.</span><span class="built_in">push</span>(i);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// while (!stk.empty()) &#123;</span></span><br><span class="line">                <span class="comment">//         left[stk.top()] = 0;</span></span><br><span class="line">                <span class="comment">// &#125;</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">                        max_area = std::<span class="built_in">max</span>(max_area, (right[i] - left[i] + <span class="number">1</span>) * heights[i]);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> max_area;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">        vector&lt;<span class="type">int</span>&gt; heights = &#123; <span class="number">2</span>, <span class="number">1</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">2</span>, <span class="number">3</span> &#125;;</span><br><span class="line">        Solution S;</span><br><span class="line">        S.<span class="built_in">largestRectangleArea</span>(heights);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">单调栈</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="栈" scheme="https://even629.com/tags/%E6%A0%88/"/>
    
    <category term="单调栈" scheme="https://even629.com/tags/%E5%8D%95%E8%B0%83%E6%A0%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P739 每日温度</title>
    <link href="https://even629.com/posts/739/"/>
    <id>https://even629.com/posts/739/</id>
    <published>2026-03-18T08:23:13.000Z</published>
    <updated>2026-03-18T08:23:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-18</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P739 每日温度" href="https://leetcode.cn/problems/daily-temperatures/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P739 每日温度</p><p class="url">https://leetcode.cn/problems/daily-temperatures/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>单调栈，栈中元素始终保持单调递减</p><figure class="highlight c++"><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="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stack&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::stack;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">dailyTemperatures</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;temperatures)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, n = temperatures.<span class="built_in">size</span>();</span><br><span class="line">                <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">res</span><span class="params">(n, <span class="number">0</span>)</span></span>;</span><br><span class="line">                stack&lt;<span class="type">int</span>&gt; stk; <span class="comment">// 单调栈，单调递减</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">                        <span class="keyword">while</span> (!stk.<span class="built_in">empty</span>() &amp;&amp; temperatures[i] &gt; temperatures[stk.<span class="built_in">top</span>()]) &#123;</span><br><span class="line">                                res[stk.<span class="built_in">top</span>()] = i - stk.<span class="built_in">top</span>();</span><br><span class="line">                                stk.<span class="built_in">pop</span>();</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        stk.<span class="built_in">push</span>(i);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> (!stk.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">                        res[stk.<span class="built_in">top</span>()] = <span class="number">0</span>;</span><br><span class="line">                        stk.<span class="built_in">pop</span>();</span><br><span class="line">                &#125;</span><br><span class="line">                res[n - <span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"></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><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">        Solution S;</span><br><span class="line">        vector&lt;<span class="type">int</span>&gt; temperatures = &#123; <span class="number">73</span>, <span class="number">74</span>, <span class="number">75</span>, <span class="number">71</span>, <span class="number">69</span>, <span class="number">72</span>, <span class="number">76</span>, <span class="number">73</span> &#125;;</span><br><span class="line">        vector&lt;<span class="type">int</span>&gt; res;</span><br><span class="line"></span><br><span class="line">        res = S.<span class="built_in">dailyTemperatures</span>(temperatures);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> val : res)</span><br><span class="line">                std::<span class="built_in">printf</span>(<span class="string">&quot;%d &quot;</span>, val);</span><br><span class="line"></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">单调栈</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="栈" scheme="https://even629.com/tags/%E6%A0%88/"/>
    
    <category term="单调栈" scheme="https://even629.com/tags/%E5%8D%95%E8%B0%83%E6%A0%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P394 字符串解码</title>
    <link href="https://even629.com/posts/394/"/>
    <id>https://even629.com/posts/394/</id>
    <published>2026-03-18T05:00:13.000Z</published>
    <updated>2025-03-18T05:00:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-18</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P394 字符串解码" href="https://leetcode.cn/problems/decode-string/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P394 字符串解码</p><p class="url">https://leetcode.cn/problems/decode-string/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>例子：<code>ab2[cd3[ef]]</code>, 用人脑是怎么读的？</p><ul><li>外层结构 <code>ab + 2[ ... ]</code></li><li>内层 <code>cd + 3[ef]</code></li><li>最里面 <code>ef</code></li></ul><p>关键点：每一层 […] 都是一个 独立子问题, 这个表达式本质是：</p><p class='p center logo large'>decode(s) = 前缀 + k * decode(子串)</p><p>当我们遇到 <code>[</code> 的时候，必须保存状态：</p><ul><li>之前的字符串是啥？</li><li>重复次数是多少？</li></ul><p>总结一句话：</p><p class='p center large'>遇到 [ 就压栈保存现场，遇到 ] 就出栈恢复现场</p><p>代码如下：</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::stack;</span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function">string <span class="title">decodeString</span><span class="params">(string s)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                stack&lt;<span class="type">int</span>&gt; times;</span><br><span class="line">                stack&lt;string&gt; strs;</span><br><span class="line"></span><br><span class="line">                string curr = <span class="string">&quot;&quot;</span>;</span><br><span class="line">                <span class="type">int</span> num = <span class="number">0</span>, k;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="type">char</span> ch : s) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (ch &gt;= <span class="string">&#x27;0&#x27;</span> &amp;&amp; ch &lt;= <span class="string">&#x27;9&#x27;</span>) &#123;</span><br><span class="line">                                num = num * <span class="number">10</span> + (ch - <span class="string">&#x27;0&#x27;</span>);</span><br><span class="line">                        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (ch == <span class="string">&#x27;[&#x27;</span>) &#123;</span><br><span class="line">                                times.<span class="built_in">push</span>(num);</span><br><span class="line">                                strs.<span class="built_in">push</span>(curr);</span><br><span class="line">                                num = <span class="number">0</span>;</span><br><span class="line">                                curr = <span class="string">&quot;&quot;</span>;</span><br><span class="line">                        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (ch == <span class="string">&#x27;]&#x27;</span>) &#123;</span><br><span class="line">                                k = times.<span class="built_in">top</span>();</span><br><span class="line">                                times.<span class="built_in">pop</span>();</span><br><span class="line">                                string prev = strs.<span class="built_in">top</span>();</span><br><span class="line">                                strs.<span class="built_in">pop</span>();</span><br><span class="line"></span><br><span class="line">                                string tmp;</span><br><span class="line">                                <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; k; i++)</span><br><span class="line">                                        tmp += curr;</span><br><span class="line"></span><br><span class="line">                                curr = prev + tmp;</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123; <span class="comment">// alpha</span></span><br><span class="line">                                curr += ch;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> curr;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">        Solution S;</span><br><span class="line">        string s1 = <span class="string">&quot;2[abc]3[cd]ef&quot;</span>;</span><br><span class="line">        string s2 = <span class="string">&quot;3[a2[c]]&quot;</span>;</span><br><span class="line">        string s3 = <span class="string">&quot;2[2[y]pq]&quot;</span>;</span><br><span class="line"></span><br><span class="line">        std::cout &lt;&lt; S.<span class="built_in">decodeString</span>(s1) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        std::cout &lt;&lt; S.<span class="built_in">decodeString</span>(s2) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        std::cout &lt;&lt; S.<span class="built_in">decodeString</span>(s3) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">栈</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="栈" scheme="https://even629.com/tags/%E6%A0%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P287 寻找重复数</title>
    <link href="https://even629.com/posts/287/"/>
    <id>https://even629.com/posts/287/</id>
    <published>2026-03-17T13:30:13.000Z</published>
    <updated>2026-03-17T13:30:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-17</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P287 寻找重复数" href="https://leetcode.cn/problems/find-the-duplicate-number/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P287 寻找重复数</p><p class="url">https://leetcode.cn/problems/find-the-duplicate-number/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><blockquote><p>鸽巢原理（也叫抽屉原理，英文 Pigeonhole Principle）是组合数学里一个非常基础但很强大的原理。</p><p>基本思想: 如果 n + 1 只鸽子放进 n 个鸽巢, 那么至少有一个鸽巢里有 ≥2 只鸽子</p></blockquote><p>这个题利用 Floyd 判圈法，转换成 P142 这种问题</p><div class="tag link"><a class="link-card" title="P142 环形链表 II" href="https://even629.com/posts/142"><div class="left"><img src="/img/avatar.png"/></div><div class="right"><p class="text">P142 环形链表 II</p><p class="url">https://even629.com/posts/142</p></div></a></div><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">int</span> <span class="title">findDuplicate</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="comment">// 1 &lt;= n &lt;= 105</span></span><br><span class="line">                <span class="comment">// nums.length == n + 1</span></span><br><span class="line">                <span class="comment">// 1 &lt;= nums[i] &lt;= n</span></span><br><span class="line">                <span class="comment">// nums 中 只有一个整数 出现 两次或多次 ，其余整数均只出现 一次</span></span><br><span class="line"></span><br><span class="line">                <span class="type">int</span> slow = <span class="number">0</span>, fast = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">do</span> &#123;</span><br><span class="line">                        slow = nums[slow];</span><br><span class="line">                        fast = nums[nums[fast]];</span><br><span class="line">                &#125; <span class="keyword">while</span> (slow != fast);</span><br><span class="line">                <span class="comment">// 相遇</span></span><br><span class="line">                slow = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">do</span> &#123;</span><br><span class="line">                        slow = nums[slow];</span><br><span class="line">                        fast = nums[fast];</span><br><span class="line">                &#125; <span class="keyword">while</span> (slow != fast);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> slow;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">双指针，鸽巢原理，Floyd判圈（ Floyd 龟兔赛跑 ）</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="双指针" scheme="https://even629.com/tags/%E5%8F%8C%E6%8C%87%E9%92%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P31 下一个排列</title>
    <link href="https://even629.com/posts/31/"/>
    <id>https://even629.com/posts/31/</id>
    <published>2026-03-17T11:11:13.000Z</published>
    <updated>2026-03-17T11:11:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-17</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P31 下一个排列" href="https://leetcode.cn/problems/next-permutation/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P31 下一个排列</p><p class="url">https://leetcode.cn/problems/next-permutation/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>例如 2, 6, 3, 5, 4, 1 这个排列， 我们想要找到下一个刚好比他大的排列，于是可以从后往前看, 我们先看后两位 4, 1 能否组成更大的排列，答案是不可以，同理 5, 4, 1也不可以, 直到3, 5, 4, 1这个排列，因为 3 &lt; 5， 我们可以通过重新排列这一段数字，来得到下一个排列</p><p>因为我们需要使得新的排列尽量小，所以我们从后往前找第一个比3更大的数字，发现是4</p><p>然后，我们调换3和4的位置，得到4, 5, 3, 1这个数列, 因为我们需要使得新生成的数列尽量小，于是我们可以对5, 3, 1进行排序，可以发现在这个算法中，我们得到的末尾数字一定是倒序排列的，于是我们只需要把它反转即可</p><p>最终，我们得到了4, 1, 3, 5这个数列, 完整的数列则是2, 6, 4, 1, 3, 5</p><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">void</span> <span class="title">nextPermutation</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, n = nums.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> pos = <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = n - <span class="number">2</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (nums[i] &lt; nums[i + <span class="number">1</span>]) &#123;</span><br><span class="line">                                pos = i;</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">if</span> (pos != <span class="number">-1</span>) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (nums[i] &gt; nums[pos]) &#123; <span class="comment">// 找到第一个大于nums[pos]的数并交换</span></span><br><span class="line">                                        std::<span class="built_in">swap</span>(nums[i], nums[pos]);</span><br><span class="line">                                        <span class="keyword">break</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                std::<span class="built_in">reverse</span>(nums.<span class="built_in">begin</span>() + pos + <span class="number">1</span>, nums.<span class="built_in">end</span>());</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">双指针</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="双指针" scheme="https://even629.com/tags/%E5%8F%8C%E6%8C%87%E9%92%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P75 颜色分类</title>
    <link href="https://even629.com/posts/75/"/>
    <id>https://even629.com/posts/75/</id>
    <published>2026-03-17T11:11:13.000Z</published>
    <updated>2026-03-17T11:11:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-17</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P75 颜色分类" href="https://leetcode.cn/problems/sort-colors/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P75 颜色分类</p><p class="url">https://leetcode.cn/problems/sort-colors/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>双指针</p><figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"></span><br><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><br><span class="line">        <span class="function"><span class="type">void</span> <span class="title">sortColors</span><span class="params">(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="comment">// n == nums.length</span></span><br><span class="line">                <span class="comment">// 1 &lt;= n &lt;= 300</span></span><br><span class="line">                <span class="comment">// nums[i] 为 0、1 或 2</span></span><br><span class="line">                <span class="type">int</span> n = nums.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">int</span> red = <span class="number">0</span>, blue = n - <span class="number">1</span>;</span><br><span class="line">                <span class="type">int</span> i = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> (red &lt; blue &amp;&amp; i &lt;= blue) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (nums[i] == <span class="number">0</span>) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i != red)</span><br><span class="line">                                        std::<span class="built_in">swap</span>(nums[i], nums[red]);</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        i++;</span><br><span class="line"></span><br><span class="line">                                red++;</span><br><span class="line">                        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (nums[i] == <span class="number">2</span>) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (i != blue)</span><br><span class="line">                                        std::<span class="built_in">swap</span>(nums[i], nums[blue]);</span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        i++;</span><br><span class="line"></span><br><span class="line">                                blue--;</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                i++;</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><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">        vector&lt;<span class="type">int</span>&gt; nums = &#123; <span class="number">2</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span> &#125;;</span><br><span class="line">        Solution S;</span><br><span class="line">        S.<span class="built_in">sortColors</span>(nums);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">双指针</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="双指针" scheme="https://even629.com/tags/%E5%8F%8C%E6%8C%87%E9%92%88/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P51 N皇后</title>
    <link href="https://even629.com/posts/51/"/>
    <id>https://even629.com/posts/51/</id>
    <published>2026-03-17T03:11:13.000Z</published>
    <updated>2026-03-17T03:11:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-17</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P51 N皇后" href="https://leetcode.cn/problems/n-queens/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P51 N皇后</p><p class="url">https://leetcode.cn/problems/n-queens/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>回溯：注意判断对角线时是两条对角线，方向分别为&quot;&quot;和&quot;/&quot;;</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_set&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"><span class="keyword">using</span> std::unordered_set;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">private</span>:</span><br><span class="line">        unordered_set&lt;<span class="type">int</span>&gt; uset;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="type">bool</span> <span class="title">queen_can_stand</span><span class="params">(vector&lt;string&gt; &amp;board, <span class="type">int</span> n, <span class="type">int</span> posi, <span class="type">int</span> posj)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> i, j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (uset.<span class="built_in">count</span>(posj))</span><br><span class="line">                        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 斜角 \</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line">                i = posi;</span><br><span class="line">                j = posj;</span><br><span class="line">                <span class="keyword">while</span> (i &gt;= <span class="number">0</span> &amp;&amp; j &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (board[i][j] == <span class="string">&#x27;Q&#x27;</span>)</span><br><span class="line">                                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        i--;</span><br><span class="line">                        j--;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 斜角 \</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line">                i = posi;</span><br><span class="line">                j = posj;</span><br><span class="line">                <span class="keyword">while</span> (i &lt; n &amp;&amp; j &lt; n) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (board[i][j] == <span class="string">&#x27;Q&#x27;</span>)</span><br><span class="line">                                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        i++;</span><br><span class="line">                        j++;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 斜角 /</span></span><br><span class="line"></span><br><span class="line">                i = posi;</span><br><span class="line">                j = posj;</span><br><span class="line">                <span class="keyword">while</span> (i &gt;= <span class="number">0</span> &amp;&amp; j &lt; n) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (board[i][j] == <span class="string">&#x27;Q&#x27;</span>)</span><br><span class="line">                                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        i--;</span><br><span class="line">                        j++;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 斜角 /</span></span><br><span class="line">                i = posi;</span><br><span class="line">                j = posj;</span><br><span class="line">                <span class="keyword">while</span> (i &lt; n &amp;&amp; j &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (board[i][j] == <span class="string">&#x27;Q&#x27;</span>)</span><br><span class="line">                                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        i++;</span><br><span class="line">                        j--;</span><br><span class="line">                &#125;</span><br><span class="line"></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">        <span class="type">void</span> __solveNQueens(vector&lt;vector&lt;string&gt; &gt; &amp;res, vector&lt;string&gt; &amp;board, <span class="type">int</span> n, <span class="type">int</span> row)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (row == n) &#123; <span class="comment">// 最后一行已经填满</span></span><br><span class="line">                        res.<span class="built_in">push_back</span>(board);</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">queen_can_stand</span>(board, n, row, j)) &#123;</span><br><span class="line">                                uset.<span class="built_in">insert</span>(j); <span class="comment">// 标识第j列已经有皇后</span></span><br><span class="line">                                board[row][j] = <span class="string">&#x27;Q&#x27;</span>;</span><br><span class="line"></span><br><span class="line">                                __solveNQueens(res, board, n, row + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                                board[row][j] = <span class="string">&#x27;.&#x27;</span>;</span><br><span class="line">                                uset.<span class="built_in">erase</span>(j);</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        vector&lt;vector&lt;string&gt; &gt; <span class="built_in">solveNQueens</span>(<span class="type">int</span> n)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> i;</span><br><span class="line">                string line;</span><br><span class="line">                vector&lt;string&gt; board;</span><br><span class="line">                vector&lt;vector&lt;string&gt; &gt; res;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">                        line.<span class="built_in">push_back</span>(<span class="string">&#x27;.&#x27;</span>);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">                        board.<span class="built_in">push_back</span>(line);</span><br><span class="line"></span><br><span class="line">                __solveNQueens(res, board, n, <span class="number">0</span>);</span><br><span class="line"></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><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">回溯</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
    <category term="回溯" scheme="https://even629.com/tags/%E5%9B%9E%E6%BA%AF/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P131 分割回文串</title>
    <link href="https://even629.com/posts/131/"/>
    <id>https://even629.com/posts/131/</id>
    <published>2026-03-16T13:32:13.000Z</published>
    <updated>2026-03-16T13:32:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-16</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P131 分割回文串" href="https://leetcode.cn/problems/palindrome-partitioning/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P131 分割回文串</p><p class="url">https://leetcode.cn/problems/palindrome-partitioning/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>回溯：找分割的字符串大小的组合，且每个组合都是回文</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">private</span>:</span><br><span class="line">        <span class="type">void</span> __partition(string &amp;s, vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; &amp;sum_vec, vector&lt;<span class="type">int</span>&gt; &amp;curr, <span class="type">int</span> curr_sum)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> i, n = s.<span class="built_in">size</span>();</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (curr_sum == n) &#123;</span><br><span class="line">                        sum_vec.<span class="built_in">push_back</span>(curr);</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (curr_sum + i &lt;= n &amp;&amp; <span class="built_in">isPalindrome</span>(s.<span class="built_in">substr</span>(curr_sum, i))) &#123;</span><br><span class="line">                                curr.<span class="built_in">push_back</span>(i);</span><br><span class="line">                                __partition(s, sum_vec, curr, curr_sum + i);</span><br><span class="line">                                curr.<span class="built_in">pop_back</span>();</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="function"><span class="type">bool</span> <span class="title">isPalindrome</span><span class="params">(string s)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">                <span class="type">int</span> left = <span class="number">0</span>, right = s.<span class="built_in">size</span>() - <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">while</span> (left &lt; right) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (s[left] != s[right])</span><br><span class="line">                                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        left++;</span><br><span class="line">                        right--;</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"></span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        vector&lt;vector&lt;string&gt; &gt; <span class="built_in">partition</span>(string s)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> pos, n = s.<span class="built_in">size</span>();</span><br><span class="line">                <span class="type">bool</span> flag = <span class="literal">false</span>;</span><br><span class="line">                vector&lt;vector&lt;string&gt; &gt; ret;</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; sum_vec;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; curr;</span><br><span class="line"></span><br><span class="line">                __partition(s, sum_vec, curr, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (vector&lt;<span class="type">int</span>&gt; &amp;combinatioin : sum_vec) &#123;</span><br><span class="line">                        vector&lt;string&gt; curr_str_vec;</span><br><span class="line">                        pos = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">for</span> (<span class="type">int</span> size : combinatioin) &#123;</span><br><span class="line">                                curr_str_vec.<span class="built_in">push_back</span>(s.<span class="built_in">substr</span>(pos, size));</span><br><span class="line">                                pos += size;</span><br><span class="line">                        &#125;</span><br><span class="line">                        ret.<span class="built_in">push_back</span>(curr_str_vec);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> ret;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>然而上面这种方法判断回文会有超级多的重复计算，考虑动态规划</p><p>我们可以将字符串 s 的每个子串 s[i…j] 是否为回文串预处理出来，使用动态规划即可。设 f(i,j) 表示 s[i…j] 是否为回文串，那么有状态转移方程：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo stretchy="false">)</mo><mo>=</mo><mi>T</mi><mi>r</mi><mi>u</mi><mi>e</mi><mo separator="true">,</mo><mi>i</mi><mo>≥</mo><mi>j</mi></mrow><annotation encoding="application/x-tex">f(i,j) = True, i≥j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo stretchy="false">)</mo><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo>=</mo><mi>s</mi><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(i,j) = f(i+1,j−1) ∧ (s[i]=s[j])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">])</span></span></span></span></span></p><p>优化后：</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::string;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">private</span>:</span><br><span class="line">        <span class="type">void</span> __partition(string &amp;s, vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; &amp;sum_vec, vector&lt;<span class="type">int</span>&gt; &amp;curr, <span class="type">int</span> curr_sum,</span><br><span class="line">                         vector&lt;vector&lt;<span class="type">bool</span>&gt; &gt; &amp;isPalindrome)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> i, n = s.<span class="built_in">size</span>();</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (curr_sum == n) &#123;</span><br><span class="line">                        sum_vec.<span class="built_in">push_back</span>(curr);</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (curr_sum + i &lt;= n &amp;&amp; isPalindrome[curr_sum][curr_sum + i - <span class="number">1</span>]) &#123;</span><br><span class="line">                                curr.<span class="built_in">push_back</span>(i);</span><br><span class="line">                                __partition(s, sum_vec, curr, curr_sum + i, isPalindrome);</span><br><span class="line">                                curr.<span class="built_in">pop_back</span>();</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        vector&lt;vector&lt;string&gt; &gt; <span class="built_in">partition</span>(string s)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="type">int</span> pos, n = s.<span class="built_in">size</span>();</span><br><span class="line">                vector&lt;vector&lt;string&gt; &gt; ret;</span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; sum_vec;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; curr;</span><br><span class="line"></span><br><span class="line">                vector&lt;vector&lt;<span class="type">bool</span>&gt; &gt; <span class="built_in">isPalindrome</span>(n, <span class="built_in">vector</span>&lt;<span class="type">bool</span>&gt;(n, <span class="literal">false</span>));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="type">int</span> j = i; j &lt; n; j++) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (s[i] == s[j]) &#123;</span><br><span class="line">                                        <span class="keyword">if</span> (j - i &lt;= <span class="number">2</span>)</span><br><span class="line">                                                isPalindrome[i][j] = <span class="literal">true</span>;</span><br><span class="line">                                        <span class="keyword">else</span></span><br><span class="line">                                                isPalindrome[i][j] = isPalindrome[i + <span class="number">1</span>][j - <span class="number">1</span>];</span><br><span class="line">                                &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                __partition(s, sum_vec, curr, <span class="number">0</span>, isPalindrome);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (vector&lt;<span class="type">int</span>&gt; &amp;combinatioin : sum_vec) &#123;</span><br><span class="line">                        vector&lt;string&gt; curr_str_vec;</span><br><span class="line">                        pos = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">for</span> (<span class="type">int</span> size : combinatioin) &#123;</span><br><span class="line">                                curr_str_vec.<span class="built_in">push_back</span>(s.<span class="built_in">substr</span>(pos, size));</span><br><span class="line">                                pos += size;</span><br><span class="line">                        &#125;</span><br><span class="line">                        ret.<span class="built_in">push_back</span>(curr_str_vec);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> ret;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>官方题解</p><figure class="highlight c++"><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></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">private</span>:</span><br><span class="line">    vector&lt;vector&lt;<span class="type">int</span>&gt;&gt; f;</span><br><span class="line">    vector&lt;vector&lt;string&gt;&gt; ret;</span><br><span class="line">    vector&lt;string&gt; ans;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">const</span> string&amp; s, <span class="type">int</span> i)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (i == n) &#123;</span><br><span class="line">            ret.<span class="built_in">push_back</span>(ans);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j = i; j &lt; n; ++j) &#123;</span><br><span class="line">            <span class="keyword">if</span> (f[i][j]) &#123;</span><br><span class="line">                ans.<span class="built_in">push_back</span>(s.<span class="built_in">substr</span>(i, j - i + <span class="number">1</span>));</span><br><span class="line">                <span class="built_in">dfs</span>(s, j + <span class="number">1</span>);</span><br><span class="line">                ans.<span class="built_in">pop_back</span>();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    vector&lt;vector&lt;string&gt;&gt; <span class="built_in">partition</span>(string s) &#123;</span><br><span class="line">        n = s.<span class="built_in">size</span>();</span><br><span class="line">        f.<span class="built_in">assign</span>(n, <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(n, <span class="literal">true</span>));</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; --i) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j = i + <span class="number">1</span>; j &lt; n; ++j) &#123;</span><br><span class="line">                f[i][j] = (s[i] == s[j]) &amp;&amp; f[i + <span class="number">1</span>][j - <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">dfs</span>(s, <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">return</span> ret;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">动态规划 + 回溯</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="动态规划" scheme="https://even629.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
    <category term="回溯" scheme="https://even629.com/tags/%E5%9B%9E%E6%BA%AF/"/>
    
  </entry>
  
  <entry>
    <title>leetcode热题100 P78 子集</title>
    <link href="https://even629.com/posts/78/"/>
    <id>https://even629.com/posts/78/</id>
    <published>2026-03-16T07:34:13.000Z</published>
    <updated>2026-03-16T07:34:13.000Z</updated>
    
    <content type="html"><![CDATA[<hr><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-03-16</p></div></div><div class='timeline-item-content'><p>init</p></div></div></div><hr><p>题目：</p><div class="tag link"><a class="link-card" title="P78 子集" href="https://leetcode.cn/problems/subsets/description/?envType=study-plan-v2&envId=top-100-liked"><div class="left"><img src="https://leetcode.cn/favicon.ico"/></div><div class="right"><p class="text">P78 子集</p><p class="url">https://leetcode.cn/problems/subsets/description/?envType=study-plan-v2&envId=top-100-liked</p></div></a></div><p>我最开始想到的就是公式化回溯：</p><figure class="highlight c++"><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><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_set&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> std::vector;</span><br><span class="line"><span class="keyword">using</span> std::unordered_set;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> &#123;</span><br><span class="line">    <span class="keyword">private</span>:</span><br><span class="line">        <span class="type">void</span> __subsets(vector&lt;<span class="type">int</span>&gt; &amp;nums, vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; &amp;subsets, vector&lt;<span class="type">int</span>&gt; &amp;curr,</span><br><span class="line">                       unordered_set&lt;<span class="type">int</span>&gt; uset, <span class="type">int</span> nr, <span class="type">int</span> start)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="keyword">if</span> (curr.<span class="built_in">size</span>() == nr) &#123;</span><br><span class="line">                        subsets.<span class="built_in">push_back</span>(curr);</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="type">int</span> i, n = nums.<span class="built_in">size</span>();</span><br><span class="line">                <span class="keyword">for</span> (i = start; i &lt; n; i++) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (uset.<span class="built_in">count</span>(nums[i]))</span><br><span class="line">                                <span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line">                        curr.<span class="built_in">push_back</span>(nums[i]);</span><br><span class="line">                        uset.<span class="built_in">insert</span>(nums[i]);</span><br><span class="line"></span><br><span class="line">                        __subsets(nums, subsets, curr, uset, nr, i + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                        curr.<span class="built_in">pop_back</span>();</span><br><span class="line">                        uset.<span class="built_in">erase</span>(nums[i]);</span><br><span class="line">                &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; <span class="built_in">subsets</span>(vector&lt;<span class="type">int</span>&gt; &amp;nums)</span><br><span class="line">        &#123;</span><br><span class="line">                <span class="comment">/*</span></span><br><span class="line"><span class="comment">                 * 1 &lt;= nums.length &lt;= 10</span></span><br><span class="line"><span class="comment">                 * -10 &lt;= nums[i] &lt;= 10</span></span><br><span class="line"><span class="comment">                 * nums 中的所有元素 互不相同</span></span><br><span class="line"><span class="comment">                 */</span></span><br><span class="line">                vector&lt;vector&lt;<span class="type">int</span>&gt; &gt; subsets;</span><br><span class="line">                vector&lt;<span class="type">int</span>&gt; curr;</span><br><span class="line">                unordered_set&lt;<span class="type">int</span>&gt; uset;</span><br><span class="line">                <span class="type">int</span> i, n = nums.<span class="built_in">size</span>();</span><br><span class="line"></span><br><span class="line">                subsets.<span class="built_in">push_back</span>(&#123;&#125;); <span class="comment">// 空集</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; n; i++)</span><br><span class="line">                        __subsets(nums, subsets, curr, uset, i, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">                subsets.<span class="built_in">push_back</span>(nums); <span class="comment">// 满集</span></span><br><span class="line">                <span class="keyword">return</span> subsets;</span><br><span class="line">        &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>leetcode 题解中方法推荐利用位运算，确实很巧妙</p><table><thead><tr><th>0/1 序列</th><th>子集</th><th>0/1 序列对应的二进制数</th></tr></thead><tbody><tr><td>000</td><td>{}</td><td>0</td></tr><tr><td>001</td><td 9=""></td><td>1</td></tr><tr><td>010</td><td 2=""></td><td>2</td></tr><tr><td>011</td><td 2,="" 9=""></td><td>3</td></tr><tr><td>100</td><td 5=""></td><td>4</td></tr><tr><td>101</td><td 5,="" 9=""></td><td>5</td></tr><tr><td>110</td><td 5,="" 2=""></td><td>6</td></tr><tr><td>111</td><td 5,="" 2,="" 9=""></td><td>7</td></tr></tbody></table><figure class="highlight c++"><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></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><br><span class="line">    vector&lt;<span class="type">int</span>&gt; t;</span><br><span class="line">    vector&lt;vector&lt;<span class="type">int</span>&gt;&gt; ans;</span><br><span class="line"></span><br><span class="line">    vector&lt;vector&lt;<span class="type">int</span>&gt;&gt; <span class="built_in">subsets</span>(vector&lt;<span class="type">int</span>&gt;&amp; nums) &#123;</span><br><span class="line">        <span class="type">int</span> n = nums.<span class="built_in">size</span>();</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> mask = <span class="number">0</span>; mask &lt; (<span class="number">1</span> &lt;&lt; n); ++mask) &#123;</span><br><span class="line">            t.<span class="built_in">clear</span>();</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">                <span class="keyword">if</span> (mask &amp; (<span class="number">1</span> &lt;&lt; i)) &#123;</span><br><span class="line">                    t.<span class="built_in">push_back</span>(nums[i]);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            ans.<span class="built_in">push_back</span>(t);</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><!-- flag of hidden posts -->]]></content>
    
    
    <summary type="html">回溯</summary>
    
    
    
    <category term="algorithm" scheme="https://even629.com/categories/algorithm/"/>
    
    
    <category term="algorithm" scheme="https://even629.com/tags/algorithm/"/>
    
    <category term="leetcode热题100" scheme="https://even629.com/tags/leetcode%E7%83%AD%E9%A2%98100/"/>
    
    <category term="回溯" scheme="https://even629.com/tags/%E5%9B%9E%E6%BA%AF/"/>
    
  </entry>
  
</feed>
