- 博客(644)
- 收藏
- 关注
原创 2025年--Lc313-662. 二叉树最大宽度--java版
下一层宽度 = list.getLast() - list.getFirst() + 1。list:存与 q 中节点一一对应的“位置编号 index”list 存这些节点在完全二叉树中的位置编号 index。(1)用 BFS 按层遍历二叉树。q 和 list 中剩下的就是下一层的节点及其编号。list 这个链表的头部取出并删除第一个元素。右孩子 = 2 * index + 1。(4)res 记录所有层中最大的宽度。左孩子 = 2 * index。根节点 index = 1。q 存当前层的真实节点;
2025-12-07 23:17:03
178
原创 2025年--Lc302-415. 字符串相加--java版
我们定义两个指针 i 和 j 分别指向 num 1 和 num 2 的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,
2025-12-04 21:24:04
227
原创 2025年--Lc302-2942. 查找包含给定字符的单词--java版
(2)每一个字符串中,在进行二次遍历,把每一个字符串变成字符数组,去遍历每个字符串的字符,如果正好等于x,记录到结果列表中(标记是在哪个字符串中,只需记录1次,所以要用到break)(1)字符串数组中,取出每一个的字符串。
2025-12-01 23:05:01
184
原创 2025年--Lc298-1019. 链表中的下一个更大节点(栈)--java版
遍历到一个新节点 cur 时,如果 cur.val 比栈顶的小或相等,那它也“没有更大值”,先压栈。对栈顶那个节点来说,当前的 cur.val 就是它“后面第一个更大的值”,res 是“答案列表”,按链表顺序存每个节点的【下一个更大节点的值】。那就把栈顶弹出,同时在结果数组对应位置写上 cur.val。你之前已经 res.add(0) 预填了 0,直接保留就行。(2)从栈底到栈顶,节点值是单调递减的。栈里剩下的节点就说明后面再也没更大的了,它在结果数组中的位置 = 0。这个节点的值 = 2。
2025-11-30 21:51:18
245
原创 2025年--Lc297-3427. 变长子数组求和--java版
因为是子数组,使用确定完左边界的值,要挨个加元素到右边界num[i]左区间a的话等于取max(0,i-nusm[i])首先子数组的取值范围是[a,b]右区间b的话等于当前的索引i,
2025-11-30 20:49:04
181
原创 2025年--Lc293-784. 字母大小写全排列(回溯)--java版
大写字符与其对应的小写字符的 ASCII 的差为 32,32 这个值如果敏感的话,它是 2。char[] ch:当前正在操作的状态/路径载体(我们在 ch 上改大小写)而这两者合并起来,就是给这个字符做一次不进位的加法,即异或上 1 << 5。int index:当前决策到第几个字符(也就是“递归到了第几层”)如果字符是小写字符,减去 32 得到大写字符;如果字符是大写字符,加上 32 得到小写字符。,在编程语言中,可以表示为 1 << 5。index 就是“当前处理到哪一位了”,深度优先遍历(回溯)
2025-11-27 21:46:22
320
原创 2025年--Lc289-71. 简化路径--java版
对于「两个点」或者「目录名」,我们则可以用一个栈来维护路径中的每一个目录名。当我们遇到「两个点」时,需要将目录切换到上一级,因此只要栈不为空,我们就弹出栈顶的目录。这样一来,我们只需要遍历 names 中的每个字符串并进行上述操作即可。在所有的操作完成后,我们将从栈底到栈顶的字符串用 / 进行连接,再在最前面加上 / 表示根目录,就可以得到简化后的规范路径。对于「空字符串」以及「一个点」,我们实际上无需对它们进行处理,因为「空字符串」没有任何含义,而「一个点」表示当前目录本身,我们无需切换目录。
2025-11-26 23:54:34
411
原创 2025年--Lc283-1527. 患某种疾病的患者-sql版
% DIAB1%’ 类似 A DIAB1…的形式 前后是其他字符串。‘DIAB1%’ 把DIAB1后面的字符串用%替代。模糊匹配,看你要模糊匹配的字符串的位置。
2025-11-25 22:42:42
145
原创 2025年--Lc282-1327. 列出指定时间段内所有的下单产品-sql版
2020 年 2 月份下单 product_id = 1 的产品的数目总和为 (60 + 70) = 130。2020 年 2 月份下单 product_id = 5 的产品的数目总和为 (50 + 50) = 100。2020 年 2 月份下单 product_id = 3 的产品的数目总和为 (2 + 3) = 5。写一个解决方案,要求获取在 2020 年 2 月份下单的数量不少于 100 的产品的名字和数目。2020 年 2 月份下单 product_id = 2 的产品的数目总和为 80。
2025-11-25 22:34:40
731
原创 2025年--Lc281-162. 寻找峰值-Java版
所以直接i=1,用nums[i]和nums[i-1]进行比较,然后设置一个变量保存当前索引,并返回。前后元素是不同的,我们返回峰值的索引是任意的,选择任意一个峰值返回。(1)传统思路,因为nums[i]!=nums[i+1](2)时间复杂度O(logN)二分查找。
2025-11-25 20:59:51
341
原创 23种设计模式总结
spring框架底层就有用到工厂模式,主要是用来进行对象之间的解耦。(1)简单工厂所有产品都共有一个工厂,如果新增产品,则需要修改代码,违反开闭原则。是一种编程习惯(2)工厂方法模式给每个产品都提供了一个工厂,让工厂专门负责对应产品的生产,遵循开闭原则。项目中用的多。(3)抽象工厂模式如果有多个维度的产品需要配合生产时,建议采用抽象工厂(工厂的工厂)一般企业开发中用的少。
2025-11-23 19:54:58
263
原创 2025年--Lc269-LCR 004. 只出现一次的数字 II-Java版
用hashmap记录元素和元素出现的频率,然后通过ma.get()方法,获取频率等于1的元素然后返回。
2025-11-17 11:08:50
434
原创 2025年--Lc232-LCR 019. 验证回文串 II-Java版
如果删除 s[right],则剩余字符的下标范围是 [left,right−1]。分别检查这两个下标范围中的子串是不是回文串,如果其中至少有一个子串是回文串,则可以通过删除一个字符将 s 变成回文串,否则不可以通过删除一个字符将 s 变成回文串。如果移动过程中,两个指针指向的字符总是相同,则字符串是回文串。特别地,如果移动过程中 s[left]=s[right] 总是成立,则 s 是回文串,不需要删除任何字符。=s[right],则需要删除 s[left] 或 s[right],才可能将 s 变成回文串。
2025-11-11 00:01:08
211
原创 2025年--Lc231-350. 两个数组的交集 II-Java版
【代码】2025年--Lc231-350. 两个数组的交集 II-Java版。
2025-11-10 22:57:49
167
原创 2025年--Lc229-32. 最长有效括号(栈)-Java版
1 表示“最左侧边界的前一位”。当一开始就出现一段合法串(比如 “()” 从下标 0 开始),长度就能算成 i - (-1)。用栈存“尚未匹配的左括号索引”;额外压入一个哨兵 -1 当“基准起点”。遇到右括号)时先弹出一个左括号(;若左括号栈空了,说明这个)无法匹配,就把它的索引当成新的基准压栈;若栈没空,当前有效长度 = 当前索引 i − 栈顶索引,更新答案。如果某个)不匹配,我们把它的下标压栈,充当“新的左边界前一位”。leetcode模式。
2025-11-01 22:29:11
298
原创 2025年--Lc228-523. 连续的子数组和(带测试用例)-Java版
【代码】2025年--Lc228-523. 连续的子数组和(带测试用例)-Java版。
2025-11-01 20:40:21
255
原创 2025年--Lc227--200. 岛屿数量(递归,带测试用例)-Java版
岛屿是1,每座岛屿只能由水平方向和竖直方向上相邻(该元素的上下左右的方向)的陆地陆续连接形成。
2025-10-31 20:52:12
194
原创 2025年--Lc226--110. 平衡二叉树(递归,带测试用例)-Java版
二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下(也可自底向下)。平衡二叉树的要求是:对于树上任意一个节点,它的左子树高度和右子树高度的差值不超过 1。并且左右子树本身也都是平衡的。这个题不是在判断是不是二叉搜索树(BST),而是在判断“这棵树是不是平衡二叉树(AVL风格)”。(1)判断左右子树的高度差是不是小于1。
2025-10-29 14:35:31
595
原创 2025年--Lc224--100. 相同的树(递归,dfs,带测试用例)-Java版
(4)调用方法递归遍历(p树的左孩子节点,q树的左孩子节点)&&(p树的右孩子节点,q树的右孩子节点。(3)考虑两棵树一棵是null,一棵树非null的情况。(2)考虑两棵树其中1棵树是null的情况。(1)考虑两棵树都是null的情况。(5)其他情况直接返回false;方法2:不带测试用例。
2025-10-29 13:57:09
312
原创 2025年--Lc223--104. 二叉树的最大深度(递归,带测试用例)-Java版
如果根节点不空,递归遍历左子树和右子树,用Math.max(左子树的深度、右子树的深度)+1计算整个树的最大深度。
2025-10-29 13:17:03
235
原创 2025年--Lc222--107. 二叉树的层序遍历 II(队列,collections.reverse())-Java版
Java 里应该用 Collections.reverse(res);这个工具方法原地反转整个 List<List>(2)定义一个大列表,也就是列表的列表,存储所有层的结果。如果队首元素左右孩子,分别把左右孩子加入到队列中。(5)最后把当前层的列表添加到大列表中。先取出队首元素并删除poll()2)定义1个小列表存储每层的值。1)计算此时队列中元素的个数。队首元素的值加入小列表中。(4)如果队列不为空。3)遍历当前层的元素。
2025-10-28 23:44:53
580
原创 2025年--Lc221--144. 二叉树的前序遍历(递归版)-Java版
根左右,如果根节点的左节点不为空,递归遍历当前res的左节点。如果根节点的右节点不为空,递归遍历当前res的右节点。
2025-10-28 23:17:19
379
原创 2025年--Lc219-590. N 叉树的后序遍历(递归版,带测试用例)-Java版
输入是按层序遍历进行序列化表示,每组子节点由null隔开。都是先把自己的子节点遍历完,再去遍历根节点。
2025-10-28 23:03:18
290
原创 2025年--Lc218-145. 二叉树的后序遍历(非递归版,栈,带测试用例)-Java版
(3)将output中的节点依次弹出并存入结果列表result中,这样得到的顺序就是后序遍历(左-右-根)。st的根入栈了先弹出。然后st的根节点的左子节点先入栈,右子节点后入栈。这样st出栈顺序是右-左。添加一个辅助栈,节点入栈的顺序是根右左,这样节点弹出的时候才是左右根。(1)根节点首先被压入stack中,然后被弹出并压入output中。out 里存的是“根-右 左”这种倒着的遍历顺序。我从 out 反向弹出时,就变成了“左 右 根”stack用于存储需要遍历的节点。用栈实现,正常的后序遍历是左右根。
2025-10-28 22:07:40
167
原创 2025年--Lc217-145. 二叉树的后序遍历(递归版,带测试用例)-Java版
递归的时候不小心把根节点也递归了,导致stackoverflow(栈溢出),应该是添加当前的根节点的值。(3)另外写1个函数,执行递归逻辑,里面包含从左右根的遍历顺序,并把该结果列表加入根节点的值。(1)定义树节点,包括int val,左节点,右节点。(4)创建树节点进行验证输出。(2)传入根节点进行递归。后序遍历包括根左右。
2025-10-28 20:56:13
196
原创 2025年--Lc216- 400. 第 N 位数字(找规律)-Java版
此时的 d 是目标数字所在整数的位数,n 是所有 d 位数中从第一位到目标数字的位数。然后将 d 加 1,将 count 乘以 10,直到 n≤d×count。(3)3位数,100~999,900个数,总位数3*900=2700。初始时 d=1,count=9。每次将 n 减去 d×count。d当前遍历到的位数,count当前位数下的所有整数的位数之和。(2)2位数,10~99,90个数,总位数2。(1)1位数 1~9,9个数,总位数1。
2025-10-24 22:19:55
232
原创 2025年--Lc215- LCR 078. 合并 K 个升序链表-Java版
2个链表的合并,需要2个指针,分别指向2个链表的头结点,并把对应的指针后移,直到2个链表遍历完成。3个链表的合并,需要3个指针,分别指向3个链表的头结点,并把对应的指针后移,直到3个链表遍历完成。lists[0] → 1 → 4 → 5 → null (头节点是 1)lists[1] → 1 → 3 → 4 → null (头节点是 1)lists[2] → 2 → 6 → null (头节点是 2)k个节点的优化就是采用小根堆。用小根堆存储k个节点,每次弹出堆顶元素,
2025-10-24 20:58:11
176
原创 2025年--Lc214- 21. 合并两个有序链表-Java版
思路,我们要明确list1和list2本身就是有序的,所以我们要比较list1的值和list2的值,然后再放入新的链表中。如果比较完,list1或list2元素还有剩余,我们直接接入到新链表后面。
2025-10-24 19:57:20
139
原创 2025年--Lc212- LCR 181. 字符串中的单词反转-Java版
split(" “) 按单个空格分割字符串,连续多个空格会产生空字符串(”")。sb.toString() 为 "world hello ",调用 trim() 去除首尾空格后,返回 (“world hello”)i=2:str[2] = “hello” → 非空,sb 变为 "world hello ";i=5:str[5] = “world” → 非空,sb 变为 "world ";i=3:str[3] = “” → 跳过;i=1:str[1] = “” → 跳过;(1)空字符串或者全是空格,返回“”
2025-10-24 19:07:17
390
原创 2025年--Lc211- 557. 反转字符串中的单词 III--Java版
(1)按一个或多个空白字符划分,避免空字符串,同时去除首尾字符。(3)每个子单词,我们进行反转,并添加到结果中。(2)正相遍历,保证单词顺序不变。(4)反转之后,要去除首尾字符。
2025-10-24 18:47:47
488
原创 2025年--Lc209- 75. 颜色分类(排序)--Java版
(1)快速排序:快速排序(Quick Sort)是一种高效的排序算法,基于分治法(Divide and Conquer)的思想。它的核心是通过选择一个基准元素(pivot),将列表分为两部分:一部分小于基准元素,另一部分大于基准元素,然后递归地对这两部分进行排序。2)分区:将列表重新排列,**使得所有小于基准元素的元素都在基准的左侧,所有大于基准元素的元素都在基准的右侧。1)选择基准元素:从列表中选择一个元素作为基准(pivot)。3)递归排序:对基准元素左侧和右侧的子列表分别递归地进行快速排序。
2025-10-23 22:02:46
271
原创 2025年--Lc208- 415. 字符串相加(双指针)--Java版
(4)当遍历完 num1,num2 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终返回 res 即可。双指针i,j分别指向nums1、nums2的末尾。(2)进位:carry=tmp/10。(1)当前位:i+j+carry。
2025-10-23 19:29:38
328
原创 2025年--Lc207- 1143. 最长公共子序列(动态规划)--Java版
【代码】2025年--Lc207- 1143. 最长公共子序列(动态规划)--Java版。
2025-10-21 16:53:41
193
原创 2025年--Lc205- 88. 合并两个有序数组--Java版
指针移动单调递增,最多移动 m+n 次,因此时间复杂度为 O(m+n)时间复杂度:O(m+n)。
2025-10-21 16:30:27
201
原创 2025年--Lc206- 409. 最长回文串(贪心)--Java版
统计每个字符的出现次数,尽量把偶数次全部用上,奇数次则用其最大的偶数部分(比如 5 次只能用 4 次),最后如果存在至少一个奇数次,可以把其中一个字符放在回文中心,再多加 1。因为有奇数频次(a 或 b),中心可放 1 个 → 最终 6 + 1 = 7。累加偶数部分:a(0) + b(0) + c(4) + d(2) = 6。能构成的最长回文长度是 7(例如 “dccaccd”)。频次:a:1, b:1, c:4, d:2。
2025-10-21 16:07:16
162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅