- 博客(24)
- 收藏
- 关注
原创 LeetCode1091
下图以示例 2 为例,数字表示 第几步首次到达 该格。想成 3×3 九宫格去掉中心。每个格子最多访问 1 次。,每个格子最多入队一次。数组 + 队列最坏满格。共 8 个方向移动。(途经单元格总数)。
2025-11-30 17:26:57
241
原创 LeetCode316
7 b a c d b b<d 但 d 后面不再出现,无法弹出,直接入栈。空间 O(1) 栈最多 26 个字母,辅助数组大小固定。但前面放了小的,后面可能没机会再放别的字母 ⇒ 需要。时间 O(n) 每个字符最多入栈、出栈一次。2 b b b<c,弹出 c,b 入栈。3 a a a<b,弹出 b,a 入栈。8 c a c d b c 已在栈,跳过。6 c a c d c 已在栈,跳过。步骤 扫描字符 栈(底→顶) 说明。5 d a c d d>c,入栈。4 c a c c>a,入栈。1 c c 直接入栈。
2025-11-23 18:11:08
344
原创 LeetCode84柱状图中的矩形
4 4 2 [1,2,4] 高=6, 宽=1 → 6高=5, 宽=2 → 10 10。6 6 0 [] 高=3, 宽=2 → 6高=2, 宽=6 → 12 12。个非负整数,表示柱状图中各个柱子的高度,每根柱子宽度为。1 1 1 [1] 高=2, 宽=1 → 2 2。7 6 0 [] 高=1, 宽=6 → 6 12。,后续不会再更新更大值,所以最终答案仍是 10。这样所有柱子最终都会被处理,无需额外收尾循环。,代码最短、最好写、面试最吃香。解释:图中红色区域面积为最大。求该柱状图能勾勒出的。
2025-11-16 13:24:49
317
原创 LeetCode 198
里,立刻变成 O(n) 时间 + O(n) 空间。解释:偷 1 号房(1)+ 3 号房(3)= 4。暴力递归 O(2^n) O(n) 指数级,必超时。时间复杂度 O(2^n),显然过不去。2.2 记忆化搜索 → 自底向上 DP。记忆化 O(n) O(n) 可 AC。解释:2 + 9 + 1 = 12。滚动数组 O(n) O(1) 最优。2.3 滚动数组优化(最终版)遍历一遍即可,空间 O(1)。版本 时间 空间 说明。
2025-11-02 17:50:59
263
原创 LeetCode300最长递增子序列
在 n=2500 时最坏约 6 \times 10^6 次运算,Java 勉强可过,但再大一点就悬了。如果我们想尽可能延长递增子序列,就要让序列的末尾元素尽可能小,这样后面才更容易接得上。贪心+二分 O(n \log n) O(n) 更小 通用,n \le 10^5 轻松。DP O(n^2) O(n) 小 n \le 5000 可接受。由于长度每增加 1,末尾元素必然严格变大,因此。版本 时间复杂度 空间复杂度 常数 适用场景。的所有递增子序列中,最小的末尾元素。自身就是严格递增的,可以用二分查找。
2025-10-26 20:02:22
311
原创 LeetCode1289 下降路径最小和2
这样就把内层枚举省掉,时间直接降到 O(n^2)。空间复杂度 = O(1) 额外空间!常数 极小,只用到基本类型。只需要知道“上一行除了。之外的最小值” 即可。3.完整代码(Java)时间 O(n^2)额外空间 O(1)
2025-10-26 16:21:25
240
原创 n&(n-1)、n&(-n)、n(n+1)
算法 树状数组、布隆过滤器、HashMap 扰动函数、Shift-Or 字符串匹配……会把最右边连续的 1 全部翻成 0,并把它们左边的第一个 0 翻成 1。把整数按“最低位 1”的权值分桶,可加速并查集或哈希冲突链。,进位链恰好把 最右边的 1 保留下来,其余高位全变 0。并行 一次运算处理 32/64 位,天然 SIMD。没有 lowBit,树状数组就“散架”了。再或一次,相当于 强制把那个 0 置 1。2.2 树状数组(Fenwick)核心。是中间关键一步,用于 扩张连续 1。存 32 个布尔,。
2025-10-26 16:12:25
759
原创 [LeetCode 931. 下降路径最小和]
最小和路径一定经过最小元素 局部最小 ≠ 全局最小,需动态规划求最值。列号可以跨多行“跳” 每一行只能向下走一行,列号最多相差 1。路径可以任意跳行 必须逐行下降,不能跳过中间行。[LeetCode 931. 下降路径最小和],请你找出并返回通过矩阵的下降路径的最小和。3.1 原地 DP(空间优化 O(1))3.2 不修改原数组版本(滚动数组)误区 正确理解。表示从第一行出发,到达第。最终答案为最后一行所有。下降路径最小和 题解。
2025-10-19 15:06:49
454
原创 62.不同路径 与 63.不同路径 II 的动态规划思想。
LeetCode 62.不同路径 与 63.不同路径 II 的动态规划思想。dp[i][j] := \text{从起点走到格子 }(i,j)\text{ 的路径总数}dp[i][j] := \text{走到 }(i,j)\text{ 且不踩障碍的路径数}初始化第 0 行/列时忽略障碍打断 一旦遇到障碍,后面全 0。遍历顺序反了(如倒序) 必须 正序,保证左、上已算好。同 62,可在返回前打印二维表,观察障碍格是否被正确置 0。时,依赖 上方 和 左方 的值,必须已算好。
2025-10-19 11:36:08
439
原创 二分图LeetCode785
else if (color[v] == color[u]) { // 冲突。它的所有节点可以被划分成两个互不相交的集合 A 与 B,使得任意一条边的两个端点都分别来自 A 和 B。if (color[i] == -1) { // 新的连通块。if (color[v] == -1) { // 未染色。1 的邻居 2 发现已被染 1,与 1 同色 → 冲突,返回 `false`- 两种颜色(0 与 1)分别代表集合 A 与 B。
2025-10-05 19:29:25
272
原创 接雨水LeetCode42
如果 `leftMax < rightMax`,那么 `left` 位置的水量由 `leftMax` 决定,移动 `left++`。2. 更新 `leftMax`/`rightMax` 要在计算水量之前,保证挡水高度是“历史最大值”。- 维护两个变量 `leftMax`、`rightMax` 记录两侧目前见过的最高柱子。- 反之由 `rightMax` 决定,移动 `right--`。- 用两个指针 `left`、`right` 分别从首尾向中间逼近。- 空间复杂度:O(1),仅用了几个变量。
2025-10-05 19:19:43
354
原创 层数最深叶子节点的和LeetCode1302
——可以边更新 `maxDepth` 边累加 `sum`,见文末「一次 DFS 变种」。> W = 最大宽度,H = 树高。2. 第二次后序遍历,当 `depth == maxDepth` 时把节点值累加到全局 `sum`。1. 经典队列层序套路,外层 `while` 控制层数,内层 `for` 处理当前层全部节点。输入:`[6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]`输入:`[1,2,3,4,5,null,6,7,null,null,null,null,8]`
2025-09-28 21:43:05
423
原创 二叉树中最大路径和
1. 全局变量必须初始化为 `Integer.MIN_VALUE`,否则全负树会错。看到 `maxSum` 一次性从负值跳到 42,就知道拐点在 `-10` 的右子树,稳!- 空间:递归栈最深树高 → O(H)(H 为树高,最坏链式退化成 O(N))初始设为 `Integer.MIN_VALUE`,防止所有节点都是负数。注意:路径可以从任意节点出发,到任意节点结束,不必经过根。只能返回单边最大贡献给父节点,否则就分叉了。
2025-09-28 21:30:31
324
原创 四叉树的建立LeetCode
LeetCode 427 要求我们把一个 仅含 0/1 的 n×n 矩阵(n 为 2 的幂)用「四叉树」压缩表示,返回根节点。3. 数组越界 → 保证 `r+len<=n` 且 `c+len<=n`,题目 n 为 2 的幂可放心二分。时间 O(n² log n) 每层递归都要 O(n²) 扫描,共 log n 层。最优叶子数 O(1) 全 0 或全 1 时只有 1 个叶子。- 前缀和/哈希 把「是否全等」查询降到 O(1),总时间 O(n²)。
2025-09-22 13:11:25
275
原创 四叉树建立LeetCode
LeetCode 427 要求我们把一个 仅含 0/1 的 n×n 矩阵(n 为 2 的幂)用「四叉树」压缩表示,返回根节点。3. 数组越界 → 保证 `r+len<=n` 且 `c+len<=n`,题目 n 为 2 的幂可放心二分。时间 O(n² log n) 每层递归都要 O(n²) 扫描,共 log n 层。最优叶子数 O(1) 全 0 或全 1 时只有 1 个叶子。- 前缀和/哈希 把「是否全等」查询降到 O(1),总时间 O(n²)。
2025-09-22 13:09:42
322
原创 岛屿数量LeetCode200
空间:O(m·n) ——最坏情况下整个矩阵全是 ‘1’,递归深度=格子数,调用栈会涨到 m·n 层(300×300=9 万层,在 HotSpot 默认栈深度下勉强能过,但再大会 StackOverflow)。2) 发现 ‘1’ ⇒ count++,创建队列,将 (i,j) 入队,并立即 grid[i][j]=’0’。每碰到一个未被访问的 ‘1’,就启动一次 DFS,把该连通块所有顶点标记成 ‘0』(沉岛),同时岛屿计数 +1。4) 当 dfs 返回,当前连通块已全部变 ‘0’,继续扫描。
2025-09-21 21:54:47
554
原创 归并与快速排序
1. 拆分:把数组从中间一刀两半,递归地对左右两半继续拆分,直到每个子数组只剩 1 个元素(天然有序)。分区 Θ(n) × 树高 ⇒ 平均 Θ(n log n),最坏 Θ(n²)。1. 选基准(pivot):从数组中随便挑一个元素(比如第一个、最后一个、中间或随机)。原地交换不占数组,只算递归栈 ⇒ 平均 Θ(log n),最坏 Θ(n)总时间 T(n) = Θ(n)·log₂n = Θ(n log n)2. 合并:把两个已排序的子数组合并成一个有序数组(双指针法)。最坏:偏斜链 ⇒ Θ(n)
2025-09-14 22:32:22
230
原创 简介哈希表
通过哈希函数将键(key)映射到一个数组的索引位置,从而快速访问对应的值(value)。// 2. 增 / 改(相同 key 会覆盖)冲突处理机制 解决不同键映射到同一索引的问题。哈希函数 将键转换为数组索引的函数。数组 存储键值对的基础结构。// 5. 遍历(entrySet 最快)键 用于查找数据的标识符。值 与键关联的数据。组成部分 说明。一.哈希表的核心思想。二.哈希表的基本组成。
2025-09-14 22:31:37
251
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅