LeetCode328题
题单 https://leetcode.cn/problem-list/RPFcUufD/
风栈
青山如故
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LC.981 | 基于时间的键值存储 | 哈希 | upper_bound快速定位
【代码】LC.981 | 基于时间的键值存储 | 哈希 | upper_bound快速定位。原创 2026-01-01 21:37:40 · 170 阅读 · 0 评论 -
LC.846 | 一手顺子 | 有序集合| map计数
(它不可能被更小的牌带着走,因为没有更小的了)。,否则后面无论怎么分组它都会卡死。统计每种牌出现次数(原创 2025-12-28 22:04:39 · 213 阅读 · 0 评论 -
LC.2353 | 设计食物评分系统 | 有序集合 | 负分数排序实现“最高分优先 + 字典序优先”
这样能保证每次修改后,菜系的“冠军”始终在。原创 2025-12-28 21:59:52 · 295 阅读 · 0 评论 -
LC.855 | 考场就座 | 有序集合 | set的应用
0, n-1]seat()ppseat()seat()leave()用一个有序集合维护当前已坐下的座位编号(自动有序)。原创 2025-12-28 21:56:39 · 297 阅读 · 0 评论 -
LC.414 | 第三大的数 | 数组 | 一次遍历维护三个最大值(去重)
如果不存在第三大的不同数字,则返回数组中的最大值。整数(第三大或最大值)。(可能包含重复元素)。题眼是“第三大”指的是。原创 2025-12-23 11:52:15 · 137 阅读 · 0 评论 -
LC.506 | 相对名次 | 哈希 | 排序后映射回原下标(分数唯一)
能减少 rehash,算是工程细节加分。位运动员得分,且所有分数互不相同。位运动员的名次描述。原创 2025-12-23 11:51:39 · 98 阅读 · 0 评论 -
LC.1382 | 将二叉搜索树变平衡 | 树 | 中序转有序数组 + 分治重建(等价于 LC.108)
这题本质就是把“已经是 BST 但形状很烂”的树,重建成“高度平衡”的形状。,节点值集合与原树完全一致(顺序可变,结构可变)。,再用“取中点当根”的分治法重建平衡 BST。先中序把所有值收集出来得到有序数组。平衡 BST 的根节点。(可能极度不平衡)。原创 2025-12-23 11:50:53 · 181 阅读 · 0 评论 -
LC.109 | 有序链表转换二叉搜索树 | 树 | 先转数组再分治建树(同 LC.108)
这题和 LC.108(有序数组转 BST)几乎是同一道题,区别只在于:这里给的是。构造出的 BST 根节点。的二叉搜索树(BST)。原创 2025-12-23 11:50:01 · 96 阅读 · 0 评论 -
LC.108 | 将有序数组转换为二叉搜索树 | 树 | 分治递归取中点
有序数组天生就是“BST 的中序遍历结果”。BST,关键就是让左右子树规模尽量接近。,左右两半分别递归构建左右子树。构造出的 BST 根节点。的二叉搜索树(BST)。原创 2025-12-23 11:45:17 · 108 阅读 · 0 评论 -
LC.173 | 二叉搜索树迭代器 | 树 | 中序展开/栈模拟
BST 根节点root,构造。实现一个按next()hasNext()按题意实现类方法(原创 2025-12-22 23:16:12 · 204 阅读 · 0 评论 -
LC.99 | 恢复二叉搜索树 | 树 | 中序遍历找“逆序对”(定位两节点再交换)
一旦有两个节点值被交换,中序序列里就会出现“乱序”,表现为。在不改变树结构的情况下恢复 BST(只允许改节点值)。BST 的中序遍历应该是。所以我们中序遍历时维护。原创 2025-12-22 23:12:29 · 133 阅读 · 0 评论 -
LC.538 | 把二叉搜索树转换为累加树 | 树 | 逆向中序遍历(右-根-左)
也能用“两次正序中序”做:第一次中序存有序数组并做后缀和映射,第二次再中序回填。但那是 O(N) 额外空间;本题一趟逆向中序就能原地搞定。BST 的中序遍历(左-根-右)是递增序列。访问顺序从大到小,维护一个滚动累加。每个节点的新值 = 原树中所有。(节点值各不相同)。原创 2025-12-22 23:11:36 · 136 阅读 · 0 评论 -
LC.98 | 验证二叉搜索树 | 树 | 中序遍历单调性
所以我们做一次中序遍历(左-根-右),并维护一个变量。判断该树是否为有效二叉搜索树(BST)。表示“上一个访问到的节点值”。原创 2025-12-22 23:10:55 · 103 阅读 · 0 评论 -
LC.230 | 二叉搜索树中第 K 小的元素 | 树 | 中序遍历计数
所以“第 k 小” = “中序遍历第 k 个访问到的节点”。中序遍历每访问一个节点就。时当前节点值就是答案。(从 1 开始计数)。原创 2025-12-22 23:10:01 · 204 阅读 · 0 评论 -
LC.783 | 二叉搜索树节点最小距离 | 树 | 中序遍历有序性
这道题如果是一棵普通的二叉树,我们需要把所有节点值存下来,两两比较,复杂度是 O(N^2)。计算树中任意两个不同节点值之间的最小差值。,我们可以利用其特性将问题极大简化。一个整数,表示最小差值。原创 2025-12-16 17:36:25 · 269 阅读 · 0 评论 -
LC.669 | 修剪二叉搜索树 | 树 | 递归与重连
可能需要改变树的根节点,修剪后的树必须保持二叉搜索树的相对结构(即:父子关系虽变,但原来的后代如果保留下来了,相对大小关系不变)。修剪该二叉搜索树,使得所有节点的值都在。题目,借着这题来回顾一下递归三要素。修剪好的二叉搜索树的新的根节点。原创 2025-12-16 17:35:15 · 311 阅读 · 0 评论 -
LC.938 | 二叉搜索树的范围和 | 树 | BST中序遍历
二叉搜索树的根节点root,以及两个整数low和high。计算树中所有值在范围内的节点值之和。一个整数,表示范围和。这道题表面是树的遍历,内里藏着最核心的“降维打击”思维。原创 2025-12-16 17:34:13 · 395 阅读 · 0 评论 -
LC.235 | 二叉搜索树的最近公共祖先 | 树 | 双解法:路径记录 vs 分岔点
找到这两个节点的最近公共祖先(LCA)。最近公共祖先节点的指针。原创 2025-12-16 17:33:26 · 219 阅读 · 0 评论 -
LC.450 | 删除二叉搜索树中的节点 | 树 | 暴力重构/转化思维
这道题的标准解法通常涉及复杂的指针操作(特别是处理双子节点的情况)。但在实际解题或笔试中,如果我们一时无法理清复杂的指针断连逻辑,可以转换思维,利用。虽然这种方法在空间和时间上不是最优(涉及大量内存分配),但它逻辑极其简单,不易出错,是一种非常实用的“工程化”解题思路——当然这题自然有正规写法,等回头思路清晰了再来写,今天先来个暴力写法开开胃。删除 BST 中的指定节点,并保证二叉搜索树性质不变。删除后的新树根节点。原创 2025-12-15 15:58:02 · 250 阅读 · 0 评论 -
LC.701 | 二叉搜索树中的插入操作 | 树 | 迭代模拟
在二叉搜索树中插入新节点,其实就是**“一次失败的查找”**。我们要找这个值应该在的位置,直到走到死胡同(空指针),那个位置就是它该待的地方。插入到二叉搜索树中,并保证插入后整棵树仍然满足 BST 的性质(左 < 根 < 右)。如果根节点为空,直接用新值创建一个节点并返回,它就是新的根。,相比递归不仅逻辑直观,而且空间复杂度更优。题目保证新值和原始树中任意节点值都不同。循环遍历树,利用 BST 性质(插入节点后的二叉搜索树的根节点。原创 2025-12-15 13:25:55 · 236 阅读 · 0 评论 -
LC.700 | 二叉搜索树中的搜索 | 树 | 利用BST有序性
的节点,并返回以该节点为根的子树。如果要找的节点不存在,返回。这使得我们在树上的搜索过程类似于。在 BST 中找到节点值等于。,不需要遍历整棵树。原创 2025-12-15 13:25:02 · 105 阅读 · 0 评论 -
LC.1008 | 前序遍历构造二叉搜索树 | 树 | 递归遍历
BST 的性质是:对于任意节点,左子树所有节点值 < 当前节点值 < 右子树所有节点值。)或者使用“上限值控制法”来避免数组拷贝,但在逻辑理解上,当前的解法是符合直觉的。根据 BST 的性质,比根节点小的元素属于左子树,比根节点大的元素属于右子树。更优的做法是传递原始数组的索引范围(前序遍历的第一个元素永远是当前子树的根节点。策略,利用了二叉搜索树(BST)的核心性质来切分数据。根据给定的先序遍历还原出二叉搜索树(BST)。,代表二叉搜索树的先序遍历结果。构造出的二叉搜索树的根节点。原创 2025-12-15 13:24:21 · 178 阅读 · 0 评论 -
LC.297 | 二叉树的序列化与反序列化 | 树 | 定长编码传递信息
本题很有意思,序列化与反序列化,然后全程只有一个字符串传递,之前我们已经做到简单版的问题,这一题一部分难点在于如何用string传递足够多的信息,颇有点计算机的本质了,就是信息的传递。设计一个算法,将二叉树序列化为一个字符串,并且可以将该字符串反序列化为原始的树结构。不限制具体的序列化逻辑(如前序、层序等),只要保证“编码 -> 解码”过程可逆且准确即可。原创 2025-12-15 13:22:16 · 375 阅读 · 0 评论 -
LC.2196 | 根据描述创建二叉树 | 树 | 哈希映射 + 寻找根节点
因为题目给出的节点描述是无序的(可能先给出叶子节点的父子关系,再给出根节点的),我们需要一个容器来存储已经创建过的节点,防止重复创建。思路:这道题的核心在于两个问题:一是如何快速找到节点并建立连接,二是如何确定谁是“根节点”。要求:根据描述构造二叉树并返回根节点 isLeft == 1 表示左子节点,isLeft == 0 表示右子节点。因此,我们在建树的同时,可以顺便维护一个状态(比如代码中用的。(从未当过儿子)的节点,就是我们要找的 Root。输出:构造出的二叉树的根节点。出现过,就把它标记为。原创 2025-12-08 17:55:39 · 167 阅读 · 0 评论 -
LC.106 | 从中序与后序遍历序列构造二叉树 | 树 | 递归
思路:这道题是“前序+中序”构造二叉树的姊妹题,逻辑几乎完全一致,只是“定位根节点”的视角变了。输入:两个整数数组 inorder(中序遍历)和 postorder(后序遍历)个就是左子树的后序,后面剩下的就是右子树的后序。同样,在中序序列中,根节点。: 利用中序遍历计算出的左子树长度,去。我们把末尾的根去掉后,剩下的序列前。空间复杂度:O(N^2)的最后一个元素,它就是当前的根。输出:构造出的二叉树的根节点。中,根节点在最前面;中,根节点总是藏在序列的。: 拿着这个根节点的值,去。中切分出对应的部分。原创 2025-12-08 17:52:27 · 314 阅读 · 0 评论 -
LC.105 | 从前序与中序遍历序列构造二叉树 | 树 | 递归分治
时间复杂度:O(N^2) //使用了vector的拷贝 进阶写法肯定是引用而不是拷贝。空间复杂度:O(N^2) //使用了vector的拷贝 进阶写法肯定是引用而不是拷贝。根据中序遍历中算出的左子树长度,在前序遍历中也能切分出对应的左子树部分(紧跟在根节点后面)。输入:两个整数数组 preorder(前序遍历)和 inorder(中序遍历):既然父节点能这么分,子节点当然也能这么分。,那么我们的递归函数也应当返回当前子树的根节点。序列,就可以递归生成左节点和右节点。输出:构造出的二叉树的根节点。原创 2025-12-08 17:49:17 · 155 阅读 · 0 评论 -
LC.2415 | 反转二叉树的奇数层 | 树| 两次BFS (记录+回填)
将每一层的节点值收集到一个临时列表 current_layer_vals 中。层(第 1, 3, 5... 层)的节点值 注意:根节点在第 0 层(偶数层),不需要反转。,就从之前准备好的 levels 数组中取出对应的数值进行赋值。,直接在存入大数组 levels 之前,将这个列表进行。思路:很典型的层序遍历题,不用多想,两次遍历稳稳搞定。这样 levels 里存的就是这一层最终该有的顺序。再次按层遍历整棵树。时间复杂度:O(N)空间复杂度:O(N)输出:反转操作后的二叉树根节点。原创 2025-12-08 17:42:52 · 152 阅读 · 0 评论 -
LC.2471 | 逐层排序二叉树所需的最少操作数目 |树 | BFS + 最小交换次数
能做到(充分性)和不能更少(必要性)。证明 1:充分性(为什么 k-1 次一定能搞定?在环中任选一个位置 i,将其当前持有的数字交换到它原本应该在的位置。效果:这一次交换后,数字回到了正确位置(即退出了环),原本长度为k的环,剩下了k-1个错位元素,形成了一个长度为k-1的新环。推导每做 1 次交换,环的长度就减 1。当执行了k-1次交换后,环的长度变为 1(即只剩最后一个元素),该元素因其他位置已满,必然自动归位。得证:k-1 次交换足以完成任务。证明 2:必要性(为什么不可能更少?初始状态。原创 2025-12-08 17:36:13 · 226 阅读 · 0 评论 -
LC.637 | 二叉树的层平均值 | 树 | 层序遍历
要求:返回一个数组,表示每一层所有节点值的平均数(double)。思路:层序遍历,外加每层遍历的时候求下平均值即可。)难度给到中等,这题还加了点反而只给了简单。时间复杂度:O(n)空间复杂度:O(n)不过有意思的是,单纯的层序遍历题(,包含从上到下每一层的平均值。输入:一棵二叉树的根节点。原创 2025-12-02 23:44:37 · 131 阅读 · 0 评论 -
LC.199 | 二叉树的右视图 | 树 | 层序遍历
要求:二叉树的右侧看过去,按从上到下的顺序,返回每一层“能看到的节点值”。输出:一个 vector<int>,按层从上往下,记录每层的最右节点。时间复杂度:O(n)空间复杂度:O(n)输入:给定一棵二叉树的根节点。原创 2025-12-02 23:41:14 · 151 阅读 · 0 评论 -
LC.662 | 二叉树最大宽度 | 树 | 层序遍历
把真实二叉树当成一棵“隐式完全二叉树”,这样做的好处是不需要真的补全 null 节点,但能够模拟完整结构,从而正确计算每一层的最左、最右逻辑位置。宽度定义为:在同一层中,最左非空节点和最右非空节点之间的(逻辑)节点数量。时间复杂度:O(n)空间复杂度:O(n)输出:一个整数,表示最大宽度。输入:一棵二叉树的根节点。要求:返回这棵二叉树的。:该层最后一个节点的编号。一层一层更新最大值即可。root 的编号是 1。:该层第一个节点的编号。原创 2025-12-02 23:38:00 · 107 阅读 · 0 评论 -
LC.102 | 二叉树的层序遍历 | 树 | 层序遍历
依次将当前层节点弹出、存进结果,再把下一层节点推入队列。要求:返回从上到下、从左到右的层序遍历结果。本层的大小由队列当前 size 决定。时间复杂度:O(n)空间复杂度:O(n)层序遍历思路非常固定。原创 2025-11-24 15:28:59 · 191 阅读 · 0 评论 -
LC.2331 | 计算布尔二叉树的值 | 树 | 递归遍历
时间复杂度:O(n)空间复杂度:O(h)要求:返回整棵树的布尔运算结果。输出:true / false。如果是叶子节点,直接返回。输入:一棵“布尔二叉树”先算出左右子树的布尔值。原创 2025-11-24 09:40:34 · 100 阅读 · 0 评论 -
LC.563 | 二叉树的坡度 | 树 | 递归遍历(子树和 + 全局累加)
整棵树的坡度 = 所有节点的坡度之和。时间复杂度:O(n)空间复杂度:O(h)要求:返回整棵树的总坡度。原创 2025-11-21 23:17:20 · 184 阅读 · 0 评论 -
LC.543 | 二叉树的直径 | 树 | DFS(深度 + 全局最长路径)
思路:实际上是每个节点都有一个左右子树深度,左树深+右树深最长的那个,就是题目要求的最长直径。可以先去做另外一题,求树的长度,再来做这题,思路就更清晰了。要求:返回二叉树的直径(任意两个节点之间的最长路径长度)输出:一个整数,表示最长路径的“边数”时间复杂度:O(n)空间复杂度:O(h)原创 2025-11-21 23:15:23 · 221 阅读 · 0 评论 -
LC.572 | 另一棵树的子树 | 树 | 递归遍历
时间复杂度:O(n × m) n 为 root 的节点数,m 为 subRoot 节点数。的根值相同,就可能成为子树的入口。空间复杂度:O(h)输出:true / false。原创 2025-11-21 23:11:54 · 185 阅读 · 0 评论 -
LC.100 | 相同的树 | 树 | 递归遍历
要求:判断两棵树是否结构相同且节点值全部相同。时间复杂度:O(n)空间复杂度:O(h)输出:true / false。一个空一个非空 → 不相同。输入:两棵二叉树 p、q。对应位置的节点值必须相同。树的结构必须完全一致。两者都为空 → 相同。原创 2025-11-21 17:26:17 · 117 阅读 · 0 评论 -
LC.965 | 单值二叉树 | 树 | 遍历
思路:核心判断条件非常简单:整棵树所有节点的值必须与根节点相同。遍历的时候顺手判定下就好。空间复杂度:O(h)时间复杂度:O(n)要求:判断所有节点的值是否都相同。输出:true / false。原创 2025-11-21 17:22:12 · 127 阅读 · 0 评论 -
LC.145 | 二叉树的后序遍历 | 树 | 递归遍历
时间复杂度:O(n)空间复杂度:O(n)输入:给定二叉树根节点。把当前节点的值加入结果。原创 2025-11-20 20:26:45 · 216 阅读 · 0 评论 -
LC.94 | 二叉树的中序遍历 | 树 | 递归遍历
然后访问当前节点(root->val)时间复杂度:O(n)空间复杂度:O(n)输出:vector<int>原创 2025-11-20 20:22:32 · 181 阅读 · 0 评论
分享