<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>打卡记录 on 木人的CS学习笔记</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/</link><description>Recent content in 打卡记录 on 木人的CS学习笔记</description><generator>Hugo -- 0.146.0</generator><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kahanat800.github.io/programmercarl-learn-record/days/index.xml" rel="self" type="application/rss+xml"/><item><title>代码随想录打卡第31天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day31/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day31/</guid><description>&lt;h2 id="56-合并区间">56. 合并区间&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/merge-intervals/">56. 合并区间&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1wx4y157nD">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>区间判重，更新 end；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> merge(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&amp;amp;&lt;/span> intervals) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sort(intervals.begin(), intervals.end()); &lt;span style="color:#6272a4">// 核心，先排序
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">int&lt;/span> start &lt;span style="color:#ff79c6">=&lt;/span> intervals[&lt;span style="color:#bd93f9">0&lt;/span>][&lt;span style="color:#bd93f9">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> end &lt;span style="color:#ff79c6">=&lt;/span> intervals[&lt;span style="color:#bd93f9">0&lt;/span>][&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span>)intervals.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> intervals[i][&lt;span style="color:#bd93f9">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> right &lt;span style="color:#ff79c6">=&lt;/span> intervals[i][&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (left &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> end) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (right &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> end) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#ff79c6">=&lt;/span> right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">continue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back({start, end});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#ff79c6">=&lt;/span> left;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#ff79c6">=&lt;/span> right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 最后一组元素需要手动push
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> res.push_back({start, end});
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="738-单调递增的数字">738. 单调递增的数字&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/monotone-increasing-digits/">738. 单调递增的数字&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Kv4y1x7tP">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>第一想法是拿个 vector 把数字都装起来，但是之后怎么做不明白；&lt;/p></description></item><item><title>代码随想录打卡第30天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day30/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day30/</guid><description>&lt;h2 id="452-用最少数量的箭引爆气球">452. 用最少数量的箭引爆气球&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/">452. 用最少数量的箭引爆气球&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0452.%E7%94%A8%E6%9C%80%E5%B0%91%E6%95%B0%E9%87%8F%E7%9A%84%E7%AE%AD%E5%BC%95%E7%88%86%E6%B0%94%E7%90%83.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1SA41167xe">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>不断地调整起点和终点范围，如果任意一边（其实是起点，排序之后有序）在范围内，就可以被引爆；&lt;/p>
&lt;p>注意如果终点也在范围内就要调整终点位置；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> findMinArrowShots(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&amp;amp;&lt;/span> points) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sort(points.begin(), points.end());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> sum &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> start &lt;span style="color:#ff79c6">=&lt;/span> points[&lt;span style="color:#bd93f9">0&lt;/span>][&lt;span style="color:#bd93f9">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> end &lt;span style="color:#ff79c6">=&lt;/span> points[&lt;span style="color:#bd93f9">0&lt;/span>][&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> points.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (points[i][&lt;span style="color:#bd93f9">0&lt;/span>] &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> end) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#ff79c6">=&lt;/span> points[i][&lt;span style="color:#bd93f9">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (points[i][&lt;span style="color:#bd93f9">1&lt;/span>] &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> end) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#ff79c6">=&lt;/span> points[i][&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#ff79c6">=&lt;/span> points[i][&lt;span style="color:#bd93f9">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> end &lt;span style="color:#ff79c6">=&lt;/span> points[i][&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> sum;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="435-无重叠区间">435. 无重叠区间&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/non-overlapping-intervals/">435. 无重叠区间&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1A14y1c7E1">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>跟 LC452 挺像的；&lt;/p></description></item><item><title>代码随想录打卡第29天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day29/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day29/</guid><description>&lt;h2 id="134-加油站">134. 加油站&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/gas-station/">134. 加油站&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1jA411r7WX">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>没想出来；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>很巧妙，其实是思维盲区；&lt;/p>
&lt;p>既然总油量大于等于总消耗有解，那么只要找到开始盈余的部分，这样剩下的油总能够支持消耗；&lt;/p>
&lt;p>这里很巧妙，因为如果总量只要是大于等于，那不管前面亏了多少，后面一定剩了多少，只要不断舍去亏损的位置就行了；&lt;/p>
&lt;p>和 LC53 是一个思想；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> canCompleteCircuit(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> gas, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> cost) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> totalDiff &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> curDiff &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> start &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 1. 如果总油量小于总消耗，不可能跑完
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#6272a4">// 2. 既然总油量大于等于总消耗有解，那么就要找到开始盈余的部分，这样才能支撑跑完全程
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> gas.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> totalDiff &lt;span style="color:#ff79c6">+=&lt;/span> gas[i] &lt;span style="color:#ff79c6">-&lt;/span> cost[i];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curDiff &lt;span style="color:#ff79c6">+=&lt;/span> gas[i] &lt;span style="color:#ff79c6">-&lt;/span> cost[i];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (curDiff &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> start &lt;span style="color:#ff79c6">=&lt;/span> i &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curDiff &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> totalDiff &lt;span style="color:#ff79c6">&amp;gt;=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span> &lt;span style="color:#ff79c6">?&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">start&lt;/span> : &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="135-分发糖果">135. 分发糖果&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/candy/">135. 分发糖果&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1ev4y1r7wN">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>没啥思路；&lt;/p></description></item><item><title>代码随想录打卡第28天 | 122. 买卖股票的最佳时机II、55. 跳跃游戏、45. 跳跃游戏II、1005. K次取反后最大化的数组和</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day28/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day28/</guid><description>&lt;h2 id="122-买卖股票的最佳时机ii">122. 买卖股票的最佳时机II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/">122. 买卖股票的最佳时机II&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1ev4y1C7na">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>连续上涨的利润等于每天差价之和&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> maxProfit(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> prices) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> profit &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> prices.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 只要后一天的股价高于前一天的股价就可以买进卖出，这样一定获利
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#6272a4">// 多次交易只是把一段长的收入拆分成了几段小的
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (prices[i] &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> prices[i &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> profit &lt;span style="color:#ff79c6">+=&lt;/span> prices[i] &lt;span style="color:#ff79c6">-&lt;/span> prices[i&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> profit;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="55-跳跃游戏">55. 跳跃游戏&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/jump-game/">55. 跳跃游戏&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1VG4y1X7kB">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>最开始在思考如何到达右边，然后写了一串复杂的判断；&lt;/p>
&lt;h3 id="看完题解后的想法-1">看完题解后的想法&lt;/h3>
&lt;p>要点不是能不能过去，而是中间会不会断&lt;/p>
&lt;p>那么如果某个点的坐标大于了之前所有点的坐标+跨度，就说明这个点到达不了，就断了&lt;/p>
&lt;p>所以要维护一个 &lt;code>最大可达坐标&lt;/code>&lt;/p>
&lt;h3 id="实现中遇到的困难-1">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码-1">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">bool&lt;/span> canJump(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> maxReach &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 如果当前最大可达坐标小于当前index，说明过不来，错误
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (i &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> maxReach) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 更新当前最大可达坐标，这里的作用就是在这个点之后的点的跨度如果小于该点，也在该点的包括范围内
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> maxReach &lt;span style="color:#ff79c6">=&lt;/span> max(maxReach, nums[i] &lt;span style="color:#ff79c6">+&lt;/span> i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (maxReach &lt;span style="color:#ff79c6">&amp;gt;=&lt;/span> nums.size() &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="45-跳跃游戏ii">45. 跳跃游戏II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/jump-game-ii/">45. 跳跃游戏II&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Y24y1r7XZ">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-2">第一想法&lt;/h3>
&lt;p>可跳区域的左右是否夹了一个更大的可以跳出这个区域的点，如果有就说明可以去这个点，跳到更远的地方；&lt;/p></description></item><item><title>代码随想录打卡第27天 | 455. 分发饼干、376. 摆动序列、53. 最大子序和</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day27/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day27/</guid><description>&lt;h2 id="贪心算法理论基础">贪心算法理论基础&lt;/h2>
&lt;p>贪心算法没有固定套路，本质就是选择每一阶段的局部最优，从而达到全局最优。&lt;/p>
&lt;ul>
&lt;li>文章：&lt;a href="https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html">代码随想录 - 贪心算法理论基础&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="455-分发饼干">455. 分发饼干&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/assign-cookies/">455. 分发饼干&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1MM411b7cq">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>始终用最小可满足的条件去满足匹配；&lt;/p>
&lt;p>整体复杂度由排序主导；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> findContentChildren(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> g, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 排序后贪心
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> sort(g.begin(), g.end());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sort(s.begin(), s.end());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> index &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> res &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> g.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (index &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> s.size() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> s[index] &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> g[i]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index&lt;span style="color:#ff79c6">++&lt;/span>; &lt;span style="color:#6272a4">// 无法满足，skip
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (index &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> s.size()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 满足条件且index合法，分配
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> res&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index&lt;span style="color:#ff79c6">++&lt;/span>; &lt;span style="color:#6272a4">// 分配之后也要前进
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="376-摆动序列">376. 摆动序列&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/wiggle-subsequence/">376. 摆动序列&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV17M411b7NS">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>遍历序列，找到每一个拐点；但是很难说清楚为什么这就是最长的；&lt;/p></description></item><item><title>代码随想录打卡第25天 | 491. 递增子序列、46. 全排列、47. 全排列II、51. N皇后、37. 解数独</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day25/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day25/</guid><description>&lt;h2 id="491-递增子序列">491. 递增子序列&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/non-decreasing-subsequences/">491. 递增子序列&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1EG4y1h78v">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>这题不能排序，同层去重又不会了；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>使用 set 记录本层使用过的数据，这是更加一般的同层去重；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>不会非排序的同层去重；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> path;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">backtracking&lt;/span>(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums, &lt;span style="color:#8be9fd">int&lt;/span> index) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (path.size() &lt;span style="color:#ff79c6">&amp;gt;=&lt;/span> &lt;span style="color:#bd93f9">2&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(path);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> unordered_set&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> used; &lt;span style="color:#6272a4">// 每层一个，记录本层用过的值
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> index; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> ((&lt;span style="color:#ff79c6">!&lt;/span>path.empty() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> nums[i] &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> path.back()) &lt;span style="color:#ff79c6">||&lt;/span> used.count(nums[i])) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">continue&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> used.insert(nums[i]); &lt;span style="color:#6272a4">// 注意退栈不用 erase，因为还在当前层
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> path.push_back(nums[i]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(nums, i&lt;span style="color:#ff79c6">+&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.pop_back();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> findSubsequences(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(nums, &lt;span style="color:#bd93f9">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="46-全排列">46. 全排列&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/permutations/">46. 全排列&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV19v4y1S79W">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>排列不需要传入 index，因为每次都是从头访问；&lt;/p></description></item><item><title>代码随想录打卡第24天 | 93. 复原IP地址、78. 子集、90. 子集II</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day24/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day24/</guid><description>&lt;h2 id="93-复原ip地址">93. 复原IP地址&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/restore-ip-addresses/">93. 复原IP地址&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1XP4y1U73i">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>和分割回文串类似，不是去构造一个合法的子串，而是去直接分割，不合法就 skip；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>最开始 path 是一个 str，对于 IP 地址要求的四段判断比较复杂；&lt;/p>
&lt;p>path 在这里也需要是 vector，这样回溯才方便；最后直接构造一个返回字符串就行；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">bool&lt;/span> isValid(string&lt;span style="color:#ff79c6">&amp;amp;&lt;/span> s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (s.size() &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span> &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> s[&lt;span style="color:#bd93f9">0&lt;/span>] &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39;0&amp;#39;&lt;/span>) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (stoi(s) &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">255&lt;/span>) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>string&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>string&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> path;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">backtracking&lt;/span>(string s, &lt;span style="color:#8be9fd">int&lt;/span> index) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (path.size() &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#bd93f9">4&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (index &lt;span style="color:#ff79c6">==&lt;/span> s.size()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(path[&lt;span style="color:#bd93f9">0&lt;/span>] &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;.&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">+&lt;/span> path[&lt;span style="color:#bd93f9">1&lt;/span>] &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;.&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">+&lt;/span> path[&lt;span style="color:#bd93f9">2&lt;/span>] &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;.&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">+&lt;/span> path[&lt;span style="color:#bd93f9">3&lt;/span>]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span>; &lt;span style="color:#6272a4">// 不管是否收集，4段了就不再递归
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> index; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> s.size() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> i &lt;span style="color:#ff79c6">-&lt;/span> index &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> &lt;span style="color:#bd93f9">3&lt;/span>; i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> string str &lt;span style="color:#ff79c6">=&lt;/span> s.substr(index, i &lt;span style="color:#ff79c6">-&lt;/span> index &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (isValid(str)) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.push_back(str);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(s, i&lt;span style="color:#ff79c6">+&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.pop_back();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">break&lt;/span>; &lt;span style="color:#6272a4">// 当前不合法后面更长也不合法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>string&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> restoreIpAddresses(string s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (s.size() &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">12&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> s.size() &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> &lt;span style="color:#bd93f9">4&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(s, &lt;span style="color:#bd93f9">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="78-子集">78. 子集&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/subsets/">78. 子集&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1U84y1q7Ci">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>自己做的时候考虑到符合条件的子集大小是变动的，就在回溯外面套了一个 while 循环去增加 size；&lt;/p></description></item><item><title>代码随想录打卡第23天 | 39. 组合总和、40. 组合总和II、131. 分割回文串</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day23/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day23/</guid><description>&lt;h2 id="39-组合总和">39. 组合总和&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/combination-sum/">39. 组合总和&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1KT4y1M7HJ">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>回溯三部曲；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>可以用排序加速剪枝；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> path;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">backtracking&lt;/span>(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> candidates, &lt;span style="color:#8be9fd">int&lt;/span> target, &lt;span style="color:#8be9fd">int&lt;/span> index, &lt;span style="color:#8be9fd">int&lt;/span> sum) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (sum &lt;span style="color:#ff79c6">==&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(path);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> index; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> candidates.size() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> sum &lt;span style="color:#ff79c6">+&lt;/span> candidates[i] &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> target; i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum &lt;span style="color:#ff79c6">+=&lt;/span> candidates[i];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.push_back(candidates[i]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(candidates, target, i, sum);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum &lt;span style="color:#ff79c6">-=&lt;/span> candidates[i];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.pop_back();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> combinationSum(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> candidates, &lt;span style="color:#8be9fd">int&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sort(candidates.begin(), candidates.end());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(candidates, target, &lt;span style="color:#bd93f9">0&lt;/span>, &lt;span style="color:#bd93f9">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="40-组合总和ii">40. 组合总和II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/combination-sum-ii/">40. 组合总和II&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0040.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CII.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV12V4y1V73A">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>依旧回溯三部曲，但是注意同层去重逻辑；&lt;/p></description></item><item><title>代码随想录打卡第22天 | 77. 组合、216. 组合总和III、17. 电话号码的字母组合</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day22/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day22/</guid><description>&lt;h2 id="回溯算法理论基础">回溯算法理论基础&lt;/h2>
&lt;ul>
&lt;li>文章：&lt;a href="https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html">代码随想录 - 回溯算法理论基础&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1cy4y167mM">B站讲解&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="77-组合">77. 组合&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/combinations/">77. 组合&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1ti4y1L7cv">B站讲解&lt;/a>&lt;/li>
&lt;li>剪枝：&lt;a href="https://www.bilibili.com/video/BV1wi4y157er">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>第一想法是回溯，但是对于如何存 path，如何回溯有点摸不着头脑;&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>不用复杂的递归返回，只把递归作为前进的路径，直接使用外部空间保存路径;&lt;/p>
&lt;p>外部空间必须在退出递归时 pop 数据，这就是回溯;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>剪枝条件写起来很复杂，但是搞清楚了如何剪枝就能马上写出来;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 回溯的模板可以这样理解：
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 1. 路径 (path)：当前已经选了哪些数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 2. 选择列表：从 start 到 n，还能选哪些数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 3. 结束条件：path.size() == k 时，收集结果
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> path;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">backtracking&lt;/span>(&lt;span style="color:#8be9fd">int&lt;/span> n, &lt;span style="color:#8be9fd">int&lt;/span> k, &lt;span style="color:#8be9fd">int&lt;/span> start) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 返回条件：找到k个数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (path.size() &lt;span style="color:#ff79c6">==&lt;/span> k) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(path);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 剪枝优化：
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 当前已有数字 path.size() 个, 还需数字 k - path.size() 个
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> 在 i 到 n 之间有 n - i + 1个数字
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> n - i + 1 &amp;gt;= k - path.size()
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> start; i &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> n &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span> &lt;span style="color:#ff79c6">+&lt;/span> path.size() &lt;span style="color:#ff79c6">-&lt;/span> k; i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.push_back(i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(n, k, i &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> path.pop_back();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&lt;/span> combine(&lt;span style="color:#8be9fd">int&lt;/span> n, &lt;span style="color:#8be9fd">int&lt;/span> k) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backtracking(n, k, &lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="216-组合总和iii">216. 组合总和III&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/combination-sum-iii/">216. 组合总和III&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1wg411873x">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>回溯三部曲：&lt;/p></description></item><item><title>代码随想录打卡第21天 | 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day21/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day21/</guid><description>&lt;h2 id="669-修剪二叉搜索树">669. 修剪二叉搜索树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/trim-a-binary-search-tree/">669. 修剪二叉搜索树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV17P41177ud">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>在小于low的节点，节点和左树全部抛掉，返回右树（如果右树不存在一样返回）；&lt;/p>
&lt;p>大于high的节点，节点和右树全部抛掉，返回左树（如果左树不存在一样返回）；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>要学会运用返回节点简化操作，这题和LC450类似，都是用返回节点简化了左右判断，因为BST自带左右；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> trimBST(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root, &lt;span style="color:#8be9fd">int&lt;/span> low, &lt;span style="color:#8be9fd">int&lt;/span> high) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> low) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#50fa7b">trimBST&lt;/span>(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right, low, high);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> high) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#50fa7b">trimBST&lt;/span>(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left, low, high);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left &lt;span style="color:#ff79c6">=&lt;/span> trimBST(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left, low, high);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right &lt;span style="color:#ff79c6">=&lt;/span> trimBST(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right, low, high);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> root;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="108-将有序数组转换为二叉搜索树">108. 将有序数组转换为二叉搜索树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/">108. 将有序数组转换为二叉搜索树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1uR4y1X7qL">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>不断取中点构造二叉树;&lt;/p></description></item><item><title>代码随想录打卡第20天 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day20/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day20/</guid><description>&lt;h2 id="235-二叉搜索树的最近公共祖先">235. 二叉搜索树的最近公共祖先&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/">235. 二叉搜索树的最近公共祖先&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Zt4y1F7ww">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>利用二叉搜索树的性质，可以用数值大小确定子树，&lt;strong>第一次&lt;/strong>遇到的在 [p, q] 或者 [q, p] 间的数，就是最近公共祖先；&lt;/p>
&lt;p>BST 中，对于当前节点 cur，有三种情况：&lt;/p>
&lt;ul>
&lt;li>情况一：cur 的值比 p 和 q 都大。说明 p 和 q 都在 cur 的左子树里，公共祖先一定在左边，cur 不是答案。&lt;/li>
&lt;li>情况二：cur 的值比 p 和 q 都小。同理，都在右子树，往右走。&lt;/li>
&lt;li>情况三：cur 的值在 p 和 q 之间（含等于）。这时候只有两种可能：&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>p 和 q 分别在 cur 的左右子树 → cur 就是公共祖先&lt;/strong>&lt;/p>
&lt;p>cur 本身就是 p 或 q 中的一个，另一个在它的子树里 → cur 也是公共祖先&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>需要确定 p 和 q 的大小关系；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> lowestCommonAncestor(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root, TreeNode&lt;span style="color:#ff79c6">*&lt;/span> p, TreeNode&lt;span style="color:#ff79c6">*&lt;/span> q) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (p&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> q&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val) swap(p, q);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> cur &lt;span style="color:#ff79c6">=&lt;/span> root;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (cur) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;gt;=&lt;/span> p&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> q&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> cur;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> &lt;span style="color:#50fa7b">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> p&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="701-二叉搜索树中的插入操作">701. 二叉搜索树中的插入操作&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/insert-into-a-binary-search-tree/">701. 二叉搜索树中的插入操作&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Et4y1c78Y">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>二叉搜索树，可以直接比大小前进；然后找到空位就可以插进去了；&lt;/p></description></item><item><title>代码随想录打卡第18天 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day18/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day18/</guid><description>&lt;h2 id="530-二叉搜索树的最小绝对差">530. 二叉搜索树的最小绝对差&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/minimum-absolute-difference-in-bst/">530. 二叉搜索树的最小绝对差&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1DD4y11779">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>中序遍历是有序的，直接用当前减过去；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>需要对最左节点进行一个特判，因为最左节点没有可以相减的；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> res &lt;span style="color:#ff79c6">=&lt;/span> INT_MAX;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> prev &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>; &lt;span style="color:#6272a4">// -1 表示还没访问过任何节点
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">dfs&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) &lt;span style="color:#ff79c6">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (prev &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res &lt;span style="color:#ff79c6">=&lt;/span> min(res, root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">-&lt;/span> prev); &lt;span style="color:#6272a4">// BST中序是升序，不需要abs
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> prev &lt;span style="color:#ff79c6">=&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> &lt;span style="color:#50fa7b">getMinimumDifference&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="501-二叉搜索树中的众数">501. 二叉搜索树中的众数&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/find-mode-in-binary-search-tree/">501. 二叉搜索树中的众数&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0501.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E4%BC%97%E6%95%B0.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1fD4y117gp">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>遍历+哈希，直接在递归中怎么做不知道；&lt;/p></description></item><item><title>代码随想录打卡第17天 | 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day17/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day17/</guid><description>&lt;h2 id="654-最大二叉树">654. 最大二叉树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/maximum-binary-tree/">654. 最大二叉树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1MG411G7ox">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>和LC105, 106一样, 但是逻辑更加简单,直接采用传index;&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>&amp;ndash;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>注意index是全局index所以直接传&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> recurse(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums, &lt;span style="color:#8be9fd">int&lt;/span> begin, &lt;span style="color:#8be9fd">int&lt;/span> end) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (begin &lt;span style="color:#ff79c6">==&lt;/span> end) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 1. 找到max值和index，这就是root
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">int&lt;/span> indexRoot &lt;span style="color:#ff79c6">=&lt;/span> begin;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> begin; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> end; i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (nums[i] &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> nums[indexRoot]) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> indexRoot &lt;span style="color:#ff79c6">=&lt;/span> i;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">new&lt;/span> TreeNode(nums[indexRoot]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 2. 挂树+直接传index做分组，注意index是全局index所以直接传
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left &lt;span style="color:#ff79c6">=&lt;/span> recurse(nums, begin, indexRoot);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right &lt;span style="color:#ff79c6">=&lt;/span> recurse(nums, indexRoot&lt;span style="color:#ff79c6">+&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>, end);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> root;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> &lt;span style="color:#50fa7b">constructMaximumBinaryTree&lt;/span>(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> recurse(nums, &lt;span style="color:#bd93f9">0&lt;/span>, (&lt;span style="color:#8be9fd">int&lt;/span>)nums.size());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="617-合并二叉树">617. 合并二叉树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/merge-two-binary-trees/">617. 合并二叉树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1m14y1Y7JK">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>使用递归， 返回 root1 ， 只要 root1 没有某棵树， 就挂上 root2 的；&lt;/p></description></item><item><title>代码随想录打卡第16天 | 513. 找树左下角的值、112. 路径总和、113. 路径总和II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day16/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day16/</guid><description>&lt;h2 id="513-找树左下角的值">513. 找树左下角的值&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/find-bottom-left-tree-value/">513. 找树左下角的值&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1424y1Z7pn">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>层序遍历，每层的第一个值&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> findBottomLeftValue(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> queue&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>TreeNode&lt;span style="color:#ff79c6">*&amp;gt;&lt;/span> q;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> q.push(root);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>q.empty()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> num &lt;span style="color:#ff79c6">=&lt;/span> q.size();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> num; i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> cur &lt;span style="color:#ff79c6">=&lt;/span> q.front();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> q.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (i &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> q.push(cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> q.push(cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="112-路径总和">112. 路径总和&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/path-sum/">112. 路径总和&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0112.%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8C.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV19t4y1L7CR">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>DFS+回溯；栈自带回溯；&lt;/p></description></item><item><title>代码随想录打卡第15天 | 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day15/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day15/</guid><description>&lt;h2 id="110-平衡二叉树">110. 平衡二叉树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/balanced-binary-tree/">110. 平衡二叉树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Ug411S7my">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>没想出来;&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>从底到顶递归算高度,很巧妙;&lt;/p>
&lt;p>对于底层叶子往上递归的过程需要理解;&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">bool&lt;/span> isBalanced(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#50fa7b">getHigh&lt;/span>(root) &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> &lt;span style="color:#50fa7b">getHigh&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 1. 递归到底之后返回 0
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 2. 左子树高度
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> getHigh(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (left &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 3. 右子树高度
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">int&lt;/span> right &lt;span style="color:#ff79c6">=&lt;/span> getHigh(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (right &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>) &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (abs(left &lt;span style="color:#ff79c6">-&lt;/span> right) &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 4. 返回当前高度,注意因为叶子节点的左右子树都是 nullptr 返回了 0,高度为 1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span> &lt;span style="color:#ff79c6">+&lt;/span> max(left, right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="257-二叉树的所有路径">257. 二叉树的所有路径&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/binary-tree-paths/">257. 二叉树的所有路径&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1ZG411G7Dh">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>使用递归，一层加一个路径；&lt;/p></description></item><item><title>代码随想录打卡第14天 | 226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day14/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day14/</guid><description>&lt;h2 id="226-翻转二叉树">226. 翻转二叉树&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/invert-binary-tree/">226. 翻转二叉树&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1sP4y1f7q7">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>遍历节点，然后交换节点的左右子树，DFS和BFS都能做；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>注意中序遍历因为是 &lt;code>左-根-右&lt;/code> ，在根节点交换完之后要继续访问左子树，因为已经交换了；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>中序和后序的迭代写法还是记不牢；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;p>前序递归解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> invertTree(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> root;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">dfs&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) &lt;span style="color:#ff79c6">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> tmp &lt;span style="color:#ff79c6">=&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right &lt;span style="color:#ff79c6">=&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left &lt;span style="color:#ff79c6">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>中序递归解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> invertTree(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> root;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">dfs&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) &lt;span style="color:#ff79c6">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> tmp &lt;span style="color:#ff79c6">=&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right &lt;span style="color:#ff79c6">=&lt;/span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left &lt;span style="color:#ff79c6">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left); &lt;span style="color:#6272a4">// 交换左右所以记得继续走左
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>前序迭代：&lt;/p></description></item><item><title>代码随想录打卡第13天 | 二叉树理论基础、递归遍历、迭代遍历、层序遍历十题</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day13/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day13/</guid><description>&lt;p>需要了解二叉树的种类，存储方式，遍历方式以及二叉树的定义。&lt;/p>
&lt;ul>
&lt;li>文章：&lt;a href="https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html">代码随想录 - 二叉树理论基础&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="dfs">DFS&lt;/h1>
&lt;h2 id="144-二叉树的前序遍历">144. 二叉树的前序遍历&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/binary-tree-preorder-traversal/">144. 二叉树的前序遍历&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Wh411S7xt">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>根 - 左 - 右&lt;/p>
&lt;p>可以递归dfs，还可以迭代用栈模拟，还可以用Morris，但是Morris太复杂了；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>前序是&amp;quot;根-左-右&amp;quot;，弹出就访问，访问完把左右子节点压栈。节点被弹出只有一种含义：该访问了。不存在&amp;quot;我还要回来&amp;quot;的情况。&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>注意压栈的顺序是后访问的先压;&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;p>递归解：(爆栈风险)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> preorderTraversal(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root, res);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">dfs&lt;/span>(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> res) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (root &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> ;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left, res);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dfs(root&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right, res);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>迭代解：(面试要求)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> preorderTraversal(TreeNode&lt;span style="color:#ff79c6">*&lt;/span> root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>root) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stack&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>TreeNode&lt;span style="color:#ff79c6">*&amp;gt;&lt;/span> st;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(root);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>st.empty()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TreeNode&lt;span style="color:#ff79c6">*&lt;/span> cur &lt;span style="color:#ff79c6">=&lt;/span> st.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> res.push_back(cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 先压后访问的
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>right);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 再压先访问的
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>left);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="145-二叉树的后序遍历">145. 二叉树的后序遍历&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/binary-tree-postorder-traversal/">145. 二叉树的后序遍历&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Wh411S7xt">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>左 - 右 - 根, 迭代解不会;&lt;/p></description></item><item><title>代码随想录打卡第11天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前K个高频元素</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day11/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day11/</guid><description>&lt;h2 id="150-逆波兰表达式求值">150. 逆波兰表达式求值&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/evaluate-reverse-polish-notation/">150. 逆波兰表达式求值&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1kd4y1o7on">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>逆波兰表达式&lt;/p>
&lt;p>逆波兰表达式：&lt;/p>
&lt;p>逆波兰表达式是一种后缀表达式，所谓后缀就是指算符写在后面。&lt;/p>
&lt;p>平常使用的算式则是一种中缀表达式，如 ( 1 + 2 ) * ( 3 + 4 ) 。&lt;/p>
&lt;p>该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。&lt;/p>
&lt;p>逆波兰表达式主要有以下两个优点：&lt;/p>
&lt;p>去掉括号后表达式无歧义，上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。&lt;/p>
&lt;p>适合用栈操作运算：遇到数字则入栈；遇到算符则取出栈顶两个数字进行计算，并将结果压入栈中&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>注意第一次出栈的是右操作数，第二次出栈的是左操作数；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> evalRPN(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>string&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> tokens) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stack&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> st;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (string&lt;span style="color:#ff79c6">&amp;amp;&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">t&lt;/span> : tokens) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;+&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;-&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;*&amp;#34;&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;/&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> a &lt;span style="color:#ff79c6">=&lt;/span> st.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> b &lt;span style="color:#ff79c6">=&lt;/span> st.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;+&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(b &lt;span style="color:#ff79c6">+&lt;/span> a);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> &lt;span style="color:#50fa7b">if&lt;/span> (t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;-&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(b &lt;span style="color:#ff79c6">-&lt;/span> a);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> &lt;span style="color:#50fa7b">if&lt;/span> (t &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#34;*&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(b &lt;span style="color:#ff79c6">*&lt;/span> a);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(b &lt;span style="color:#ff79c6">/&lt;/span> a);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> st.push(stoll(t));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> st.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="239-滑动窗口最大值">239. 滑动窗口最大值&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/sliding-window-maximum/">239. 滑动窗口最大值&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1XS4y1p7qj">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>老员工比新员工菜就优化，老员工大于35也优化&lt;/p></description></item><item><title>代码随想录打卡第10天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day10/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day10/</guid><description>&lt;h2 id="232-用栈实现队列">232. 用栈实现队列&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/implement-queue-using-stacks/">232. 用栈实现队列&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1nY4y1w7VC">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>一个栈 s1 用来入队，一个栈 s2 用来出队；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>最开始每次把数据从 s1 倒入 s2 还要把 s2 中的数据倒回去，为了保持顺序一致；&lt;/p>
&lt;p>但是其实可以做一个简化，只有s2中空了才从s1中补充，这样其实是分段连续的；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">MyQueue&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MyQueue() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">push&lt;/span>(&lt;span style="color:#8be9fd">int&lt;/span> x) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s1.push(x);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> &lt;span style="color:#50fa7b">pop&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> transfer();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> res &lt;span style="color:#ff79c6">=&lt;/span> s2.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s2.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> &lt;span style="color:#50fa7b">peek&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> transfer();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> res &lt;span style="color:#ff79c6">=&lt;/span> s2.top();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> res;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">bool&lt;/span> &lt;span style="color:#50fa7b">empty&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> s1.empty() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> s2.empty();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">private&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stack&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> s1;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stack&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> s2;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">transfer&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (s2.empty()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (&lt;span style="color:#ff79c6">!&lt;/span>s1.empty()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s2.push(s1.top());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s1.pop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="225-用队列实现栈">225. 用队列实现栈&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/implement-stack-using-queues/">225. 用队列实现栈&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Fd4y1K7sm">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>刚开始用两个queue互相捣腾数据；&lt;/p></description></item><item><title>代码随想录打卡第9天 | 151. 翻转字符串里的单词、55. 右旋字符串、28. 实现strStr()、459. 重复的子字符串</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day09/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day09/</guid><description>&lt;h2 id="151-翻转字符串里的单词">151. 翻转字符串里的单词&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/reverse-words-in-a-string/">151. 翻转字符串里的单词&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1uT41177fX">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>第一想法感觉这道题好麻烦，然后拆解任务一共三步：&lt;/p>
&lt;ol>
&lt;li>去掉两端以及中见多余的空格&lt;/li>
&lt;li>翻转整个字符串&lt;/li>
&lt;li>挨着翻转每个单词&lt;/li>
&lt;/ol>
&lt;p>其中在挨着翻转每个单词的时候因为尾端没有空格，所以临时加上一个空格在翻转完之后再去掉，避免了尾处理；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>原地去空格使用双指针法， 最后需要resize，注意使用的size就是slow最后停留的index；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> string reverseWords(string s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> endSpace(s);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reverse(s, &lt;span style="color:#bd93f9">0&lt;/span>, (&lt;span style="color:#8be9fd">int&lt;/span>)s.size()&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> right &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (right &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span>)s.size()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (right &lt;span style="color:#ff79c6">==&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span>)s.size() &lt;span style="color:#ff79c6">||&lt;/span> s[right] &lt;span style="color:#ff79c6">==&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39; &amp;#39;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reverse(s, left, right&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">++&lt;/span>right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> right&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 去掉两端以及中见多余的空格
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">endSpace&lt;/span>(string&lt;span style="color:#ff79c6">&amp;amp;&lt;/span> s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> slow &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> fast &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; fast &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span>)s.size(); fast&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (s[fast] &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39; &amp;#39;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (slow &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[slow&lt;span style="color:#ff79c6">++&lt;/span>] &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39; &amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (fast &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span>)s.size() &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> s[fast] &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39; &amp;#39;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[slow&lt;span style="color:#ff79c6">++&lt;/span>] &lt;span style="color:#ff79c6">=&lt;/span> s[fast&lt;span style="color:#ff79c6">++&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s.resize(slow);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 翻转函数
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">reverse&lt;/span>(string&lt;span style="color:#ff79c6">&amp;amp;&lt;/span> s, &lt;span style="color:#8be9fd">int&lt;/span> left, &lt;span style="color:#8be9fd">int&lt;/span> right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> l &lt;span style="color:#ff79c6">=&lt;/span> left;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> r &lt;span style="color:#ff79c6">=&lt;/span> right;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (l &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> r) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">char&lt;/span> tmp &lt;span style="color:#ff79c6">=&lt;/span> s[r];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[r] &lt;span style="color:#ff79c6">=&lt;/span> s[l];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[l] &lt;span style="color:#ff79c6">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> l&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> r&lt;span style="color:#ff79c6">--&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="kamacoder-55-右旋字符串">KamaCoder 55. 右旋字符串&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://kamacoder.com/problempage.php?pid=1065">KamaCoder 55. 右旋字符串&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/kamacoder/0055.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：无&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>刚开始是准备整体移动+栈来构造新的字符串；&lt;/p></description></item><item><title>代码随想录打卡第8天 | 344. 反转字符串、541. 反转字符串II、54. 替换数字</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day08/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day08/</guid><description>&lt;h2 id="344-反转字符串">344. 反转字符串&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/reverse-string/">344. 反转字符串&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1fV4y17748">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>双指针法&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> reverseString(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">char&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> s) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> n &lt;span style="color:#ff79c6">=&lt;/span> s.size();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>, right &lt;span style="color:#ff79c6">=&lt;/span> n &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (left &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">char&lt;/span> tmp &lt;span style="color:#ff79c6">=&lt;/span> s[left];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[left] &lt;span style="color:#ff79c6">=&lt;/span> s[right];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[right] &lt;span style="color:#ff79c6">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> right&lt;span style="color:#ff79c6">--&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="541-反转字符串ii">541. 反转字符串II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/reverse-string-ii/">541. 反转字符串II&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1dT411j7NN">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>反转字符串写成可传位置的函数，然后一段段翻转，最后处理尾巴；&lt;/p>
&lt;h3 id="看完题解后的想法-1">看完题解后的想法&lt;/h3>
&lt;p>用 for 循环每次跳 2k 更简洁；&lt;/p>
&lt;h3 id="实现中遇到的困难-1">实现中遇到的困难&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="代码-1">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> string reverseStr(string s, &lt;span style="color:#8be9fd">int&lt;/span> k) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> n &lt;span style="color:#ff79c6">=&lt;/span> s.size();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> time &lt;span style="color:#ff79c6">=&lt;/span> n &lt;span style="color:#ff79c6">/&lt;/span> (&lt;span style="color:#bd93f9">2&lt;/span>&lt;span style="color:#ff79c6">*&lt;/span> k);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> tail &lt;span style="color:#ff79c6">=&lt;/span> n &lt;span style="color:#ff79c6">%&lt;/span> (&lt;span style="color:#bd93f9">2&lt;/span>&lt;span style="color:#ff79c6">*&lt;/span> k);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> index &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (time &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapStr(s, index, index&lt;span style="color:#ff79c6">+&lt;/span>k&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index &lt;span style="color:#ff79c6">=&lt;/span> index &lt;span style="color:#ff79c6">+&lt;/span> &lt;span style="color:#bd93f9">2&lt;/span> &lt;span style="color:#ff79c6">*&lt;/span> k ;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> time&lt;span style="color:#ff79c6">--&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (tail &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span> &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> tail &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> k) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapStr(s, index, index&lt;span style="color:#ff79c6">+&lt;/span>tail&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swapStr(s, index, index&lt;span style="color:#ff79c6">+&lt;/span>k&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">void&lt;/span> &lt;span style="color:#50fa7b">swapStr&lt;/span>(string&lt;span style="color:#ff79c6">&amp;amp;&lt;/span> s, &lt;span style="color:#8be9fd">int&lt;/span> l, &lt;span style="color:#8be9fd">int&lt;/span> r) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> l, right &lt;span style="color:#ff79c6">=&lt;/span> r;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (left &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">char&lt;/span> tmp &lt;span style="color:#ff79c6">=&lt;/span> s[left];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[left] &lt;span style="color:#ff79c6">=&lt;/span> s[right];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> s[right] &lt;span style="color:#ff79c6">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> right&lt;span style="color:#ff79c6">--&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="kamacoder-54-替换数字">KamaCoder 54. 替换数字&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://kamacoder.com/problempage.php?pid=1064">KamaCoder 54. 替换数字&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/kamacoder/0054.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：无&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-2">第一想法&lt;/h3>
&lt;p>刚开始在纠结如何原地扩展；&lt;/p></description></item><item><title>代码随想录打卡第7天 | 454. 四数相加II、383. 赎金信、15. 三数之和、18. 四数之和</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day07/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day07/</guid><description>&lt;h2 id="454-四数相加ii">454. 四数相加II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/4sum-ii/">力扣454&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1Md4y1Q7Yh">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>two sum的变形，把数组两两分组之后变成two sum；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>这里最开始看到分组都要两层循环，时间复杂度达到 $O(n^2)$ ，就觉得在查询逻辑里可以不用哈希直接遍历，因为也是两层循环；&lt;/p>
&lt;p>但是这个是要考虑数组大小的，原来的数组大小是 $n$ ，分组求和之后就是 $n^2$ ，如果再两层遍历循环这个 $n^2$ 的数组复杂度就是 $O(n^4)$ ；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> fourSumCount(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums1, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums2, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums3, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums4) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> unordered_map&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>, &lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&lt;/span> hash;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> cnt &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums1.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> j &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; j &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums2.size(); j&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hash[nums1[i] &lt;span style="color:#ff79c6">+&lt;/span> nums2[j]]&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums3.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> j &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; j &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums4.size(); j&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> sum &lt;span style="color:#ff79c6">=&lt;/span> nums3[i] &lt;span style="color:#ff79c6">+&lt;/span> nums4[j];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (hash.count(&lt;span style="color:#ff79c6">-&lt;/span>sum) &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cnt &lt;span style="color:#ff79c6">+=&lt;/span> hash[&lt;span style="color:#ff79c6">-&lt;/span>sum];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> cnt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="383-赎金信">383. 赎金信&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/ransom-note/">力扣383&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html">代码随想录&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>类似于异构词，但是只用部分一致；&lt;/p></description></item><item><title>代码随想录打卡第6天 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day06/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day06/</guid><description>&lt;h2 id="242-有效的字母异位词">242. 有效的字母异位词&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/valid-anagram/">力扣242&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1YG411p7BA">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>这道题要判断两个字符串包含的字符是否完全一致，第一想法就是哈希表；&lt;/p>
&lt;p>仔细思考就会发现因为只有26个字符，所以不需要使用完整的哈希表，只需要使用一个定长数组模拟哈希就行了；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>最开始的时候将 &lt;code>s&lt;/code> 的写入和判断的 &lt;code>t&lt;/code> 的减少分开在了两个循环中，其实一次循环就能做；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">bool&lt;/span> isAnagram(string s, string t) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (s.size() &lt;span style="color:#ff79c6">!=&lt;/span> t.size()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> cnt[&lt;span style="color:#bd93f9">26&lt;/span>] &lt;span style="color:#ff79c6">=&lt;/span> {};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> i &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; i &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> s.size(); i&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cnt[s[i] &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39;a&amp;#39;&lt;/span>]&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cnt[t[i] &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#f1fa8c">&amp;#39;a&amp;#39;&lt;/span>]&lt;span style="color:#ff79c6">--&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">c&lt;/span> : cnt) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (c &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="349-两个数组的交集">349. 两个数组的交集&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/intersection-of-two-arrays/">力扣349&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1ba411S7wu">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>使用集合去重+记录出现元素,之后再用集合去重;&lt;/p></description></item><item><title>代码随想录打卡第4天 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点、面试题02.07. 链表相交、142. 环形链表II</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day04/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day04/</guid><description>&lt;h2 id="24-两两交换链表中的节点">24. 两两交换链表中的节点&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/swap-nodes-in-pairs/">力扣24&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1YT411g7br">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>两两交换，头节点也要进入交换，要把这种特殊情况转变为一般情况，所以需要引入dummyHead；
让之后的交换都是某个节点的next和next-&amp;gt;next；变成了一般性问题；&lt;/p>
&lt;p>还有就是三指针的交换顺序，这里采用标记了最后需要指向的节点降低心智负担；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>dummy.next忘记指向head了；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> swapPairs(ListNode&lt;span style="color:#ff79c6">*&lt;/span> head) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode &lt;span style="color:#50fa7b">dummy&lt;/span>(&lt;span style="color:#bd93f9">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dummy.next &lt;span style="color:#ff79c6">=&lt;/span> head;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> cur &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">&amp;amp;&lt;/span>dummy;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span> &lt;span style="color:#ff79c6">&amp;amp;&amp;amp;&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> finalFoward &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> firstMove &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> secondMove &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">=&lt;/span> firstMove;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> firstMove&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">=&lt;/span> secondMove;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> secondMove&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">=&lt;/span> finalFoward;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> dummy.next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="19-删除链表的倒数第n个节点">19. 删除链表的倒数第N个节点&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/remove-nth-node-from-end-of-list/">力扣19&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1vW4y1U7Gf">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>第一想法是反转链表，然后从头找过去，然后删除节点再返回来；&lt;/p></description></item><item><title>代码随想录打卡第3天 | 203. 移除链表元素、707. 设计链表、206. 反转链表</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day03/</link><pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day03/</guid><description>&lt;h2 id="203-移除链表元素">203. 移除链表元素&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/remove-linked-list-elements/">力扣203&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV18B4y1s7R9">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>因为要删除节点，可能头节点本身也是要删除的，因此引入dummy_head，这样之后的所有节点都是next节点也不用区分是不是头节点；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>实现的时候忽略了next的next仍然可能是要删除的值；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> removeElements(ListNode&lt;span style="color:#ff79c6">*&lt;/span> head, &lt;span style="color:#8be9fd">int&lt;/span> val) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode &lt;span style="color:#50fa7b">dummy&lt;/span>(INT_MAX);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dummy.next &lt;span style="color:#ff79c6">=&lt;/span> head;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ListNode&lt;span style="color:#ff79c6">*&lt;/span> cur &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">&amp;amp;&lt;/span>dummy;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">!=&lt;/span> &lt;span style="color:#ff79c6">nullptr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>val &lt;span style="color:#ff79c6">==&lt;/span> val) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 只是删掉了后继的第一个节点，可能有连续需要删除的
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cur &lt;span style="color:#ff79c6">=&lt;/span> cur&lt;span style="color:#ff79c6">-&amp;gt;&lt;/span>next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6272a4">// 只有cur-&amp;gt;next不是目标才能走
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> dummy.next;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="707-设计链表">707. 设计链表&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/design-linked-list/">力扣707&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1FU4y1X7WD">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>考察的是类的基本书写，需要注意各种代码规范；&lt;/p>
&lt;p>因为有频繁的插入和删除，所以需要维护一个dummyHead来保证不用单独处理Head的情况；&lt;/p></description></item><item><title>代码随想录打卡第2天 | 209. 长度最小的子数组、59. 螺旋矩阵II、58. 区间和、44. 开发商购买土地</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day02/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day02/</guid><description>&lt;h2 id="209-长度最小的子数组">209. 长度最小的子数组&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/minimum-size-subarray-sum/">力扣209&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1tZ4y1q7XE">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>看到这道题的第一想法是做一个前缀和，但是引入前缀和之后需要去减去之后恰好小于target的另一个前缀和，遍历的话复杂度就会变成 $O(n^2)$ ，然后想到了可以二分查找；&lt;/p>
&lt;p>但是仔细思考一下就会发现，可以维护一个队列，不断把数据push进去，一旦找到大于target的就开始把前面的数据踢出去，直到再次小于target；这样就不需要复杂的查找了；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>队列在这里其实就是一个双指针维护的滑动窗口；&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>result需要判断当前窗口大小和历史result谁更小，使用双指针滑动窗口不会有问题，但是如果是用队列来维护滑动窗口，需要使用queue.size(),返回的类型是size_t，需要强制转换成int；&lt;/p>
&lt;p>一开始还给result直接赋值0，但是这样在min里会锁死最小值；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> minSubArrayLen(&lt;span style="color:#8be9fd">int&lt;/span> target, vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> sum &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> result &lt;span style="color:#ff79c6">=&lt;/span> INT_MAX;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> (&lt;span style="color:#8be9fd">int&lt;/span> right &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>; right &lt;span style="color:#ff79c6">&amp;lt;&lt;/span> nums.size(); right&lt;span style="color:#ff79c6">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum &lt;span style="color:#ff79c6">+=&lt;/span> nums[right];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (sum &lt;span style="color:#ff79c6">&amp;gt;=&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#ff79c6">=&lt;/span> min(result, right&lt;span style="color:#ff79c6">-&lt;/span>left&lt;span style="color:#ff79c6">+&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum &lt;span style="color:#ff79c6">=&lt;/span> sum &lt;span style="color:#ff79c6">-&lt;/span> nums[left];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left&lt;span style="color:#ff79c6">++&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> result &lt;span style="color:#ff79c6">==&lt;/span> INT_MAX &lt;span style="color:#ff79c6">?&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span> &lt;span style="color:#ff79c6">:&lt;/span> result;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="59-螺旋矩阵ii">59. 螺旋矩阵II&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/spiral-matrix-ii/">力扣59&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1SL4y1N7mV">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：❌&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>看完题目的第一想法就是如何移动坐标去填充数据，然后就被边界条件卡住了；&lt;/p></description></item><item><title>代码随想录打卡第1天 | 704. 二分查找、27. 移除元素、977. 有序数组的平方</title><link>https://kahanat800.github.io/programmercarl-learn-record/days/day01/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://kahanat800.github.io/programmercarl-learn-record/days/day01/</guid><description>&lt;h2 id="704-二分查找">704. 二分查找&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/binary-search/">力扣704&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV1fA4y1o715">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：✅&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法">第一想法&lt;/h3>
&lt;p>二分查找母题；&lt;/p>
&lt;p>有闭区间和开区间两种解法：&lt;/p>
&lt;p>闭区间：&lt;code>right&lt;/code> 初始化为 &lt;code>nums.size()-1&lt;/code> ,是实右边界；在进入 &lt;code>while&lt;/code> 循环时就要注意需要判断 &lt;code>left == right&lt;/code>；同时每次移动边界都要从已经找到的地方往右或往左移动一步；&lt;/p>
&lt;p>开区间：&lt;code>right&lt;/code> 初始化为 &lt;code>nums.size()&lt;/code> ,是虚右边界；在进入 &lt;code>while&lt;/code> 循环时就要注意写 &lt;code>left &amp;lt; right&lt;/code>；移动时左边界是 &lt;code>mid+1&lt;/code>， 而右边界是 &lt;code>mid&lt;/code>；&lt;/p>
&lt;h3 id="看完题解后的想法">看完题解后的想法&lt;/h3>
&lt;p>——&lt;/p>
&lt;h3 id="实现中遇到的困难">实现中遇到的困难&lt;/h3>
&lt;p>采用实变界进入循环的判断忘记了需要判断&lt;code>left == right&lt;/code>；&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">class&lt;/span> &lt;span style="color:#50fa7b">Solution&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">public&lt;/span>&lt;span style="color:#ff79c6">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> search(vector&lt;span style="color:#ff79c6">&amp;lt;&lt;/span>&lt;span style="color:#8be9fd">int&lt;/span>&lt;span style="color:#ff79c6">&amp;gt;&amp;amp;&lt;/span> nums, &lt;span style="color:#8be9fd">int&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> left &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> right &lt;span style="color:#ff79c6">=&lt;/span> nums.size()&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">while&lt;/span> (left &lt;span style="color:#ff79c6">&amp;lt;=&lt;/span> right) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd">int&lt;/span> mid &lt;span style="color:#ff79c6">=&lt;/span> left &lt;span style="color:#ff79c6">+&lt;/span> (right&lt;span style="color:#ff79c6">-&lt;/span>left)&lt;span style="color:#ff79c6">/&lt;/span>&lt;span style="color:#bd93f9">2&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> (nums[mid] &lt;span style="color:#ff79c6">==&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> mid;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> &lt;span style="color:#50fa7b">if&lt;/span> (nums[mid] &lt;span style="color:#ff79c6">&amp;gt;&lt;/span> target) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> right &lt;span style="color:#ff79c6">=&lt;/span> mid&lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff79c6">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> left &lt;span style="color:#ff79c6">=&lt;/span> mid&lt;span style="color:#ff79c6">+&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">return&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span>&lt;span style="color:#bd93f9">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="27-移除元素">27. 移除元素&lt;/h2>
&lt;ul>
&lt;li>链接：&lt;a href="https://leetcode.cn/problems/remove-element/">力扣27&lt;/a>&lt;/li>
&lt;li>文章：&lt;a href="https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html">代码随想录&lt;/a>&lt;/li>
&lt;li>视频：&lt;a href="https://www.bilibili.com/video/BV12A4y1Z7LP">B站讲解&lt;/a>&lt;/li>
&lt;li>状态：⚠️&lt;/li>
&lt;/ul>
&lt;h3 id="第一想法-1">第一想法&lt;/h3>
&lt;p>第一想法就是维护两个指针，&lt;code>left&lt;/code> 找到 &lt;code>val&lt;/code> 位置，而 &lt;code>right&lt;/code> 从右边找不为val的值，当左右相遇说明找完了；&lt;/p></description></item></channel></rss>