- 博客(48)
- 收藏
- 关注
原创 hot100-48腐烂的橘子
2、遍历网格,将腐烂的橘子加入队列,并且新鲜的橘子计数统计。如果新鲜的橘子为0,那么腐烂的时间为0。如果队列不为空,就BFS传播,从队列中取出当前腐烂的橘子,并将四周的橘子变腐烂。1、DFS是一条路走到黑,从一个腐烂橘子出发,先一路向下感染到底,再回溯。所以这道题要用BFS,逐层遍历,按时间层推进。代码学习的是小红书的尼布斯老师,写的好好,思路写的也好好,很清晰易懂。m x n 的网格 grid 中,每个单元格可以有三个值:0、1、2。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
2025-12-12 23:55:23
297
原创 hot100-47岛屿数量
遇到未访问的 '1' 启动搜索,一层层向外扩展,将整个岛屿的所有格子标记为已访问。都在主函数中遍历网格,每遇到一个未处理的陆地('1')就计数加一,并通过搜索(DFS 或 BFS)将该陆地所属的整个岛屿全部标记为“已处理”,避免重复计数。:DFS 直接将原数组中的 '1' 改为 '0' 来标记访问,不使用额外空间;1、深度优先搜索DFS:遍历网格,如果当前格子是'1',说明找到了一个新的岛屿。递归把上下左右淹没整个岛屿(把相连的 '1' 改为 '0')数组来记录是否访问过,仅对未访问的 '1' 进行处理。
2025-12-10 22:58:26
236
原创 hot100-46二叉树的最近公共祖先
1、递归的过程中,如果p和q位于该节点的两侧,那么该节点就是最近公共祖先。如果再同一侧,那就要继续递归。给定一个二叉树,找出树中两个指定节点的最近公共祖先。
2025-12-09 17:38:13
146
原创 hot100-45路径总和III
2、先序遍历,处理当前节点,更新sum和map,再递归左右子树,到达一个节点时,这个路径应该立即包含它,左右子树才能继续延伸。给定一个二叉树根节点root,和一个整数targetSum,求该二叉树节点值之和等于targetSum的路径的数目。1、使用前缀和+哈希表,dfs回溯。
2025-12-08 22:19:36
155
原创 hot100-44从前序与中序遍历构造二叉树
前序遍历数组的第一个值为根节点,找到根节点在中序遍历数组中的索引位置,分别通过左右子树在前序遍历和中序遍历的索引范围构建左子树和右子树。给出两个整数数组,前序遍历preorder和中序遍历inorder,请构造二叉树并返回根节点。1、前序遍历:根左右,第一个元素就是根节点,中序遍历,左根右,根节点左边左子树,右边右子树。2、遍历中序遍历的数组,记录下值对应的index,便于寻找根节点的索引。递归的种植条件是,前序遍历的左边界>右边界。
2025-12-04 22:43:00
226
原创 hot100-43二叉树展开为链表
找到左子树的最右节点,保存下来最右节点,然后将左子树转移到右子节点上,找到其最右节点,将右子节点设置为保存下来的最右节点。给定一个二叉树的根节点,展开成一个链表。左节点始终为null。当函数为void时,终止递归,可以用return;
2025-12-04 10:05:32
132
原创 hot100-41二叉搜索树中第K小的元素
1、二叉搜索树找第k小的数,中序遍历是升序数组,访问到第k个节点时,它的值就是答案。给定一个二叉搜索树的根节点root,和一个整数k,找出其中第k小的元素。这个代码,找到了第k小的值仍然会遍历整个树。
2025-12-02 20:30:31
113
原创 hot100-41验证二叉搜索树
1、函数的作用判断该二叉树是否是二叉搜索树。二叉搜索树的左子树所有节点的值必须严格小于它,右子树中所有节点的值必须严格大于它。(是整个左/右子树,不仅仅是左右子节点)。只接受一个参数(根节点),所以需要写一个辅助函数,传递min和max信息。所以,需要每个节点都有一个合法区间,根节点的合法区间是。1)每个节点都有一个数据域,且所有节点的数据域互不相同。给定根节点,判断是否有一个有效的二叉搜索树。2)左子树的所有节点的值都小于根节点的值。3)右子树的所有节点的值都大于根节点的值。,右子节点的合法区间是。
2025-12-02 19:56:36
252
原创 hot100-40将有序数组转换为二叉搜索树
1、二叉搜索树的特性是左子树 < 根节点 < 右子树,对于升序数组,选择数组的中间节点作为根节点,左半部分构造左子树,右半部分构造右子树。给定一个整数数组nums,其中元素按升序排列,转换为一个平衡二叉搜索树。
2025-12-02 09:46:50
132
原创 hot100-39二叉树层序遍历
声明Queue类型的引用变量queue,并用LinkedList实例化。4)弹出队列中的节点,将对应的值加入list,并将其左右子节点加入queue。3)每次循环新创建一个list(新的一层),通过长度n控制for循环。将元素加入队列尾部,入队。2)使用一个队列,先加入根节点root,用队列的长度控制循环。等价于queue.add(root);
2025-12-01 17:58:36
358
原创 hot100-38二叉树的直径
经过某个节点的直径是左深度+右深度,这个结果值需要用全局变量来记录,因为他不是返回给父节点的值,父节点需要的深度。所以需要写一个辅助函数,递归深度。二叉树的直径是这个树中两个任意节点的最长路径的长度,两个任意节点的最长路径的长度由他们之间的边数表示。1、递归,二叉树的最大直径为,左子树深度or右子树深度的最大值+1。给定root,返回该树的直径。直径=左深度+右深度。
2025-11-29 16:53:44
171
原创 hot100-37对称二叉树
1、这个函数是给定一个节点判断是否轴对称,不能在这个函数里写递归,因为左子树、右子树不对称,可能整个树是对称的。所以写一个传左右子节点的函数,判断是否轴对称。终止条件:左子节点和右子节点都为null返回true。当左子节点右子节点有一个为null,则不对称返回false,判断左右子节点的值如果不等则返回false。给定一个根节点root,检查是否轴对称。(或两者都真),整个表达式就是。A && B 只有当。
2025-11-29 15:52:10
296
原创 hot100-36翻转二叉树
1、深度优先遍历,递归的方法,终止条件:判断root== null,返回,然后左子节点翻转,右子节点翻转,再分别交换赋值。给定一个root,翻转这颗二叉树,并返回根节点。
2025-11-29 15:13:06
170
原创 hot100-35二叉树的最大深度
给定root,返回最大深度,最大深度指,从根节点到最远子节点的最长路径上的节点数。2、深度优先搜索,深度是左节点深度或右节点深度的最大值+1。
2025-11-28 10:43:29
180
原创 hot100-31排序链表
本题是在归并排序中,希望把链表分成前半部分和后半部分。要拿到slow的前一个节点,从此断开为两部分。把一个大问题不断拆成两个小问题,直到不能再分(通常只剩 1 个元素)。偶数长度的链表,slow停在后半部分的第一个节点。给出链表头节点,按升序排序并返回排序后的链表。把两个已经排好序的子序列合并成一个有序序列。对于数组或链表:从中间切开,分成左右两半。合并过程使用双指针,像拉链一样“拉”起来。奇数长度的链表,slow停在正中间的节点。2、快慢指针找中间节点。借用k神的图,来自力扣。
2025-11-27 10:48:02
307
原创 hot100-30LRU
put方法:如果key存在,用value覆盖掉值,若不存在,插入key-value,插入后判断长度是否超过capacity,超过要逐出最久未使用的关键字。1、O(1)操作key-value使用HashMap,其中HashMap的key是key,value为Node。LRUCache的属性:capacity、size、链表的头节点、链表的尾节点。get方法:如果key在缓存中,返回关键字的值O(1),否则为-1,移动到头部。创建一个Node,两个属性key,value,其中Node作为前驱和后继。
2025-11-26 21:54:32
200
原创 hot100-29随机链表的复制
上面的代码是使用hashmap实现的,面某国企考过这道题,当时面试官问,力扣的题目Node类是没有重写equals和hashCode方法的,默认使用了Object类的实现,比较对象的引用地址是否相同,这样即使是两个节点的val相同,他们在内存地址不同就是不同的对象,hashmap也不会覆盖掉。1、遍历链表,用map保存所有原始节点到新复制出的节点的映射,需要根据原节点之间的关系(next和random)来设置新节点之间的关系。链表中,每个节点包含一个额外的随机指针random,构造这个链表的深拷贝。
2025-11-26 11:28:13
297
原创 hot100-28两两交换链表中的节点
1、创建虚拟头节点,记录交换两个节点后面的节点,然后交换两个节点后,pre和head后移。给定一个链表,两两交换其中的相邻节点,并返回交换后链表的头节点。
2025-11-24 11:01:33
198
原创 hot100-27删除链表的倒数第N个节点
1、创建虚拟头节点,利用快慢指针。快指针先走n+1步,然后快慢指针一起走,当快指针走向null时,慢指针走向删除的节点的前一个节点,然后删除掉节点。给定一个链表,删除链表的倒数第n个节点,并返回头节点。
2025-11-24 10:47:28
191
原创 hot100-26两数相加
进位:jin = sum / 10;值的个位:count = sum % 10;从链表头部相加,并且记录进位,移动链表节点指针。两个数相加,返回一个和的链表。
2025-11-23 13:20:00
116
原创 hot100-25合并有序链表
1、初始化创建一个dummy用于返回,然后创建一个cur当前指针,比较两个链表头部当前值的大小,cur去接较小的一个节点,然后链表节点后移,cur当前节点也后移。将两个升序链表合并成一个新的有序链表。
2025-11-23 13:10:15
194
原创 hot100-23-24环形链表I and II
2、有环,相遇后,快指针指向头部,快慢指针都走一步,再次相遇则为入环节点。1、(先判断是否有环)快指针两步,慢指针一步,如果有环,快慢指针会相遇。1、快指针两步,慢指针一步,如果有环,快慢指针会相遇。有环则返回环处的交点。
2025-11-22 16:29:52
211
原创 hot100-22回文链表
1、链表不好用左右指针,先将链表转换为一个ArrayList结构,然后左右指针比较值是否相等。给定一个单链表的头节点,判断是否为回文节点,是返回true,不是返回false。
2025-11-22 16:21:20
135
原创 hot100-21反转链表
1、在while循环中反转两个节点,存下一个节点,指针改成反向,双指针往前走。给定一个单链表的头节点head,请反转链表,并返回。
2025-11-21 14:49:33
167
原创 hot100-20相交链表
1、两个指针a b分别从两个头部开始,走到null终点后,指向另一个头部,当 a == b 时,要么是交点,要么都是 null。给定两个单链表的头节点headA和headB,找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点则返回null。
2025-11-21 14:35:45
162
原创 hot100-19搜索二维矩阵II
1、从右上角开始,与target大小比较,如果大于target就向左寻找,如果小于target就向下寻找。mxn的矩阵,特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。
2025-11-20 10:31:34
138
原创 hot100-17螺旋矩阵
1、定义top、bottom、left、right四个边界,res.size!= row*col为条件,向四周扩展,结构集中加元素。m行n列的矩阵,按照顺时针螺旋顺序,返回矩阵中的所有元素。注意:每个 for 循环里同时检查。
2025-11-19 21:00:07
196
原创 hot100-16矩阵置零
1、遍历每个位置,用HashSet记录含有0的行和列索引(HashSet可以去重和快速查找),再遍历行Set,将行置零,遍历列Set,将列置零。给定一个mxn的矩阵,如果一个元素为0,那么将行和列的元素都置零。array 要填充的一维数组,value 要填入的值。这里行可以用,但是列不能用。
2025-11-19 09:43:29
235
原创 hot100-15除自身以外数组的乘积
1、创建一个left左的积,一个right右的积,然后左右相乘就是处自身以外的乘积。一个数组,返回除自身以外的乘积的数组。
2025-11-18 23:53:28
196
原创 hot100-14轮转数组
给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。1、创建长度为2倍的数组,复制两次,然后再截取复制一次。
2025-11-17 22:01:59
212
原创 hot100-13合并区间
按照区间的起始位置进行排序。1、排序数组,再遍历,比较当前区间与下一个区间是否重叠,如果重叠则更新下一个区间,不重叠直接加入结果。2、注意:遍历时为了不越界+1,遍历到 intervals.length-2,最后要加上最后一个区间。List转成二维数组。以数组表示若干个区间的集合,合并所有的重叠区间,返回一个不重叠的区间数组。
2025-11-17 10:40:50
171
原创 hot100-12最大子数组和
当前位置的最大子数组的和,要么是当前位置本身开启的起点(如果之前和小于0),要么是之前的和继续加和(如果之前和大于0)。1、动态规划:dp记录当前位置的最大子数组的和,状态转移方程为dp = Math.max(num,dp+num);给定一个整数数组nums,找出具有最大和的连续子数组,返回其最大和。2、遍历数组,记录当前位置的最大子数组的和,再更新结果的最大值。
2025-11-16 20:33:21
139
原创 hot100-10和为k的子数组
2、遍历数组,判断当前的前缀和-k是否有出现过,若出现过说明有以当前位置结尾且和为k的子数组。每次将当前的前缀和放入map中记录。map.getOrDefault(sum,0):返回key为sum的value,没有该key则返回0。给定一个整数数组nums和一个整数k,统计并返回该数组中和为k的子数组的个数。1、用一个数组记录当前位置的前缀和,并用哈希表存储前缀和和出现的次数。
2025-11-16 20:16:11
98
原创 hot100-9找出字符串中所有字母异位词
用数组p_fre[26]记录字符串的p中每个字符出现的次数,用一个指针left+字符串的长度来维护一个窗口,统计字符串的频率,并与p_fre[26]比较,相等则将指针left加入结果集当中。Arrays.equals(s_fre,p_fre)比较两个数组是否相等。给定两个字符串s和p,找到s中所有p的异位词,返回这些子串的起始索引。
2025-11-15 23:17:18
139
原创 hot100-8无重复字符的最长子串
1、使用map记录出现的字符和索引下标。使用双指针计算长度,左指针是窗口左边界,扩大窗口右边界,判断是否有重复元素,有的重复元素就更新左边界(注意:左边界只能前进不能后退)字符串可以不用转char[],之前的题目字符串.toCharArray()转字符数组是要排序Array.sort();给定一个字符串,找出不含重复字符的最长子串的长度。用s.charAt(索引下标)就可以取出字符。注意:left不能回退,只能向前。
2025-11-14 16:38:54
171
原创 hot100-6三数之和
1、对数组进行排序,固定一个数,利用双指针,去找补数。注意:i,j,k都需要去重。Arrays.asList(a, b, c)作用是:创建一个包含。给定一个数组,判断是否存在三元组判断是否存在三元组。
2025-11-14 16:29:54
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅