<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LeetCode on Chen Kai Blog</title><link>https://www.chenk.top/zh/leetcode/</link><description>Recent content in LeetCode on Chen Kai Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 13 Sep 2022 09:00:00 +0000</lastBuildDate><atom:link href="https://www.chenk.top/zh/leetcode/index.xml" rel="self" type="application/rss+xml"/><item><title>LeetCode（十）—— 栈与队列</title><link>https://www.chenk.top/zh/leetcode/10-%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/</link><pubDate>Tue, 13 Sep 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/10-%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97/</guid><description>&lt;p>栈和队列在数据结构里看起来很不起眼，可一旦真做起算法题，会发现它们出现的频率高得惊人。原因其实只有一句：大部分题目本质上都是在问&lt;strong>访问顺序&lt;/strong>——栈是后进先出（LIFO），队列是先进先出（FIFO），再加上单调栈、双端队列、优先队列这几个变体，括号匹配、下一个更大元素、滑动窗口最值、前 K 大、BFS、还有一票&amp;quot;用 X 实现 Y&amp;quot;的题，几乎全在它们的射程之内。&lt;/p></description></item><item><title>LeetCode（九）—— 贪心算法</title><link>https://www.chenk.top/zh/leetcode/09-%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/</link><pubDate>Mon, 29 Aug 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/09-%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/</guid><description>&lt;p>贪心算法看起来像是一种&amp;quot;投机取巧&amp;quot;——每一步只挑当前最划算的选项，从不回头，居然最后能拿到全局最优。代码常常短得离谱，跑得也快。但贪心的真正难点不是写代码，而是&lt;strong>判断这道题到底允不允许贪心&lt;/strong>。同样一个 &lt;code>argmax&lt;/code> 循环，在跳跃游戏上完全正确，在 &lt;code>{1, 3, 4}&lt;/code> 找零上就会给出错误答案。&lt;/p></description></item><item><title>LeetCode（八）—— 回溯算法</title><link>https://www.chenk.top/zh/leetcode/08-%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/</link><pubDate>Sun, 14 Aug 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/08-%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/</guid><description>&lt;p>回溯算法是处理&amp;quot;列举所有可能&amp;quot;这一类问题的标准武器：所有排列、所有子集、所有合法棋盘、网格里所有路径。它的本质是带剪枝的暴力搜索——一次走一步，碰到死路立刻退回去，把刚才做的选择&amp;quot;撤回&amp;quot;，让下一条分支看到一个干净的状态。整套方法只有三步：&lt;/p></description></item><item><title>LeetCode（七）—— 动态规划入门</title><link>https://www.chenk.top/zh/leetcode/07-%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E5%85%A5%E9%97%A8/</link><pubDate>Sat, 30 Jul 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/07-%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E5%85%A5%E9%97%A8/</guid><description>&lt;p>动态规划在算法学习里有种被神化的气质，听起来高深莫测，做起来又总像在凑公式。其实它一点都不玄。DP 就是一个非常朴素的想法：&lt;strong>把同样的子问题算一次就够了，别反复算&lt;/strong>。所有让人头大的「状态转移方程」「滚动数组」「区间 DP」，归根结底都是围绕这一个想法在打转。&lt;/p></description></item><item><title>LeetCode（六）—— 二叉树遍历与构造</title><link>https://www.chenk.top/zh/leetcode/06-%E4%BA%8C%E5%8F%89%E6%A0%91%E9%81%8D%E5%8E%86%E4%B8%8E%E6%9E%84%E9%80%A0/</link><pubDate>Fri, 15 Jul 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/06-%E4%BA%8C%E5%8F%89%E6%A0%91%E9%81%8D%E5%8E%86%E4%B8%8E%E6%9E%84%E9%80%A0/</guid><description>&lt;p>二叉树类的题目，本质几乎从来不在&amp;quot;树&amp;quot;上，而在两件事上：&lt;strong>你按什么顺序碰节点&lt;/strong>，以及&lt;strong>在决定父节点要做什么之前，你已经从子节点拿到了什么信息&lt;/strong>。把这两件事想透，前序、中序、后序、层序四种遍历，递归与迭代两种写法，从两种遍历序列还原一棵树，乃至最大深度、验证 BST 这类经典题，都能收敛到同一套配方上。这篇文章就是把这套配方从头讲到尾。&lt;/p></description></item><item><title>LeetCode（五）—— 二分查找</title><link>https://www.chenk.top/zh/leetcode/05-%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/</link><pubDate>Thu, 30 Jun 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/05-%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/</guid><description>&lt;p>二分查找是一种&amp;quot;看着简单、写起来翻车&amp;quot;的算法。思路一句话能讲完——&lt;em>每次把搜索区间砍掉一半&lt;/em>——但真要在面试中一气呵成写对、还要分得清&amp;quot;找第一个&amp;quot;和&amp;quot;找任意一个&amp;quot;，就会发现各种边界条件让人抓狂。本文不打算再罗列一遍模板，而是想说清楚一件事：&lt;strong>为什么模板长这样&lt;/strong>。一旦理解了背后的不变量，&lt;code>&amp;lt;&lt;/code> 还是 &lt;code>&amp;lt;=&lt;/code>、&lt;code>right = mid&lt;/code> 还是 &lt;code>right = mid - 1&lt;/code>，就不再是需要硬背的细节，而是机械推导出来的结论。&lt;/p></description></item><item><title>LeetCode（四）—— 滑动窗口技巧</title><link>https://www.chenk.top/zh/leetcode/04-%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%8A%80%E5%B7%A7/</link><pubDate>Wed, 15 Jun 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/04-%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%8A%80%E5%B7%A7/</guid><description>&lt;p>如果你写过两层 &lt;code>for&lt;/code> 循环去枚举所有连续子数组，那么&lt;strong>滑动窗口&lt;/strong>多半就是你缺的那一步优化。它把 $O(nk)$ 或 $O(n^2)$ 的暴力枚举压成线性的一遍扫描，关键就在于&amp;quot;复用上一步算出来的东西&amp;quot;。本文从最朴素的直觉出发，先讲清楚思路，再用四道高频 LeetCode 题目把套路彻底落地，最后再补一个单调队列的进阶用法。&lt;/p></description></item><item><title>LeetCode（三）—— 链表操作</title><link>https://www.chenk.top/zh/leetcode/03-%E9%93%BE%E8%A1%A8%E6%93%8D%E4%BD%9C/</link><pubDate>Tue, 31 May 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/03-%E9%93%BE%E8%A1%A8%E6%93%8D%E4%BD%9C/</guid><description>&lt;p>链表是最能逼着你&lt;strong>用指针思考&lt;/strong>的数据结构。数组给你一个下标就能跳到任意位置；链表只丢给你一个头指针，剩下的全靠自己一步步走。这种从「随机访问」到「顺序追指针」的切换，正是链表题在面试里反复出现的原因——题目本身简单到一句话讲完，做对却要求你具备最基本的工程素养：&lt;strong>画图、给指针起名字、绝不在没判空时解引用&lt;/strong>。&lt;/p></description></item><item><title>LeetCode（二）—— 双指针技巧</title><link>https://www.chenk.top/zh/leetcode/02-%E5%8F%8C%E6%8C%87%E9%92%88%E6%8A%80%E5%B7%A7/</link><pubDate>Mon, 16 May 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/02-%E5%8F%8C%E6%8C%87%E9%92%88%E6%8A%80%E5%B7%A7/</guid><description>&lt;p>哈希表是用空间换时间，双指针正好相反：用一点结构假设（数组有序、链表可能成环、答案落在某个连续窗口里），换来 $O(n)$ 时间和 $O(1)$ 额外空间。代码看起来再朴素不过——两个下标、一个 &lt;code>while&lt;/code> 循环——但它是新手最容易踩坑的技巧：下标差一、死循环、漏掉去重、平手时移错指针。真正能把这些坑填掉的，不是死记移动规则，而是用&lt;strong>循环不变量&lt;/strong>去思考。&lt;/p></description></item><item><title>LeetCode（一）—— 哈希表</title><link>https://www.chenk.top/zh/leetcode/01-%E5%93%88%E5%B8%8C%E8%A1%A8/</link><pubDate>Sun, 01 May 2022 09:00:00 +0000</pubDate><guid>https://www.chenk.top/zh/leetcode/01-%E5%93%88%E5%B8%8C%E8%A1%A8/</guid><description>&lt;p>哈希表是工具箱里性价比最高的&amp;quot;超能力&amp;quot;：每个元素只多花一点点内存，就能让&amp;quot;这个值我之前见过吗？&amp;ldquo;这种查询变成几乎一条指令的开销。一整类暴力 $O(n^2)$ 的解法，只要换上哈希表，就能直接坍缩成 $O(n)$ 的一次遍历。&lt;/p></description></item></channel></rss>