Tagged

LeetCode

Sep 13, 2022 LeetCode Patterns 12 min read

LeetCode(十)—— 栈与队列

栈和队列在数据结构里看起来很不起眼,可一旦真做起算法题,会发现它们出现的频率高得惊人。原因其实只有一句:大部分题目本质上都是在问访问顺序——栈是后进先出(LIFO),队列是先进先出(FIFO),再加上单调栈、双端队列、优先队列这几个变体,括号匹配、下一个更大元素、滑动窗口最值、前 K 大、BFS、还有一票"用 X 实现 Y"的题,几乎全在它们的射程之内。

Aug 29, 2022 LeetCode Patterns 15 min read

LeetCode(九)—— 贪心算法

贪心算法看起来像是一种"投机取巧"——每一步只挑当前最划算的选项,从不回头,居然最后能拿到全局最优。代码常常短得离谱,跑得也快。但贪心的真正难点不是写代码,而是判断这道题到底允不允许贪心。同样一个 argmax 循环,在跳跃游戏上完全正确,在 {1, 3, 4} 找零上就会给出错误答案。

Aug 14, 2022 LeetCode Patterns 13 min read

LeetCode(八)—— 回溯算法

回溯算法是处理"列举所有可能"这一类问题的标准武器:所有排列、所有子集、所有合法棋盘、网格里所有路径。它的本质是带剪枝的暴力搜索——一次走一步,碰到死路立刻退回去,把刚才做的选择"撤回",让下一条分支看到一个干净的状态。整套方法只有三步:

Jul 30, 2022 LeetCode Patterns 12 min read

LeetCode(七)—— 动态规划入门

动态规划在算法学习里有种被神化的气质,听起来高深莫测,做起来又总像在凑公式。其实它一点都不玄。DP 就是一个非常朴素的想法:把同样的子问题算一次就够了,别反复算。所有让人头大的「状态转移方程」「滚动数组」「区间 DP」,归根结底都是围绕这一个想法在打转。

Jul 15, 2022 LeetCode Patterns 12 min read

LeetCode(六)—— 二叉树遍历与构造

二叉树类的题目,本质几乎从来不在"树"上,而在两件事上:你按什么顺序碰节点,以及在决定父节点要做什么之前,你已经从子节点拿到了什么信息。把这两件事想透,前序、中序、后序、层序四种遍历,递归与迭代两种写法,从两种遍历序列还原一棵树,乃至最大深度、验证 BST 这类经典题,都能收敛到同一套配方上。这篇文章就是把这套配方从头讲到尾。

Jun 30, 2022 LeetCode Patterns 12 min read

LeetCode(五)—— 二分查找

二分查找是一种"看着简单、写起来翻车"的算法。思路一句话能讲完——每次把搜索区间砍掉一半——但真要在面试中一气呵成写对、还要分得清"找第一个"和"找任意一个",就会发现各种边界条件让人抓狂。本文不打算再罗列一遍模板,而是想说清楚一件事:为什么模板长这样。一旦理解了背后的不变量,< 还是 <=、right = mid …

Jun 15, 2022 LeetCode Patterns 9 min read

LeetCode(四)—— 滑动窗口技巧

如果你写过两层 for 循环去枚举所有连续子数组,那么滑动窗口多半就是你缺的那一步优化。它把 $O(nk)$ 或 $O(n^2)$ 的暴力枚举压成线性的一遍扫描,关键就在于"复用上一步算出来的东西"。本文从最朴素的直觉出发,先讲清楚思路,再用四道高频 LeetCode 题目把套路彻底落地,最后再补一个单调队列的进阶用法。

May 31, 2022 LeetCode Patterns 11 min read

LeetCode(三)—— 链表操作

链表是最能逼着你用指针思考的数据结构。数组给你一个下标就能跳到任意位置;链表只丢给你一个头指针,剩下的全靠自己一步步走。这种从「随机访问」到「顺序追指针」的切换,正是链表题在面试里反复出现的原因——题目本身简单到一句话讲完,做对却要求你具备最基本的工程素养:画图、给指针起名字、绝不在没判空时解引用。

May 16, 2022 LeetCode Patterns 11 min read

LeetCode(二)—— 双指针技巧

哈希表是用空间换时间,双指针正好相反:用一点结构假设(数组有序、链表可能成环、答案落在某个连续窗口里),换来 $O(n)$ 时间和 $O(1)$ 额外空间。代码看起来再朴素不过——两个下标、一个 while 循环——但它是新手最容易踩坑的技巧:下标差一、死循环、漏掉去重、平手时移错指针。真正能把这些坑填掉的,不是死记移动规则,而是用循环不变量去思考。

May 1, 2022 LeetCode Patterns 11 min read

LeetCode(一)—— 哈希表

哈希表是工具箱里性价比最高的"超能力":每个元素只多花一点点内存,就能让"这个值我之前见过吗?“这种查询变成几乎一条指令的开销。一整类暴力 $O(n^2)$ 的解法,只要换上哈希表,就能直接坍缩成 $O(n)$ 的一次遍历。