- 博客(65)
- 收藏
- 关注
原创 hot100-64跳跃游戏
给定一个非负数数组nums,最初位于数组的第一个下标。数组中的每个元素代表在该位置可以跳跃的最大长度。判断是否可以到达最后一个下标,如果可以,返回true,否则返回false。表示当前能够到达的最远位置,从左到右遍历数组,每到一个位置就尝试用它来更新最远可达范围(达到或超过最后一个下标,就说明可以跳到最后,返回。如果在遍历过程中发现当前位置。已经超出了当前能到达的最远位置(即。),说明无法继续前进,直接返回。1、贪心算法:维护一个变量。整个过程只需一次遍历。
2026-01-03 22:32:03
198
原创 hot100-63买卖股票的最佳时机
给定一个数组prices,它的第 i 个元素 prices[i]表示一支给定股票第 i 天的价格,只能选择某一天买入这只股票,并且选择未来某一个不同的日子卖出该股票,设计一个算法来计算所能获取的最大利润。返回最大利润,如果不能获取任何利润,返回0。1、遍历数组,记录最小买入价格,每一天都尝试以当前价格卖出,最大利润 = 当前价格 - 历史最低买入价,比较今天卖能赚多少,就能计算出当前的最大利润。
2026-01-02 21:42:22
145
原创 hot100-61电话号码的字母组合
1、通过回溯法,对每个数字依次尝试其对应的所有字母,构建所有可能的组合,直到完成整个字符串的映射。给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合,答案可以按任意顺序返回。给出数字和字母的映射,1不对应任何字母。
2026-01-01 16:28:24
199
原创 hot100-60子集
给定一个整数数组nums,数组中的元素互不相同,返回该数组所有可能的子集。1、使用回溯算法,按顺序枚举每个元素“选”或“不选”的所有可能组合,通过控制起始下标。的作用:强制只往后选,不回头,保证每个组合只按一种顺序(如递增下标)生成,天然去重。的作用:全局标记哪些元素已用,允许在任意位置选择任意未用元素,从而穷尽所有顺序。原因:全排列要求用完所有元素,只有当路径长度等于数组长度时,才是一个完整排列。原因:子集可以是任意长度(包括空集),每一步的 path 都是一个合法子集。4)子集“一进入就加元素”
2025-12-31 15:44:16
171
原创 hot100-59全排列
通过递归逐层构建排列路径,每一步从剩余未使用的数字中选择一个加入当前路径,当路径长度等于数组长度时得到一个完整排列。,以探索其他可能的组合,从而系统地穷举出所有 n!给定不含重复数字的数组nums,返回所有可能的全排列。数组高效标记已选元素,并在递归返回后。
2025-12-31 12:18:34
341
原创 hot100-58每日温度
2、遍历每一天,如果当前温度高于栈顶日期温度,说明找到了更暖的一天。填answer数组:弹出栈顶,计算等待天数,当前天-栈顶天,重复此过程,直到栈空或当前温度小于等于栈顶温度。其中answer[i]对于第i天,下一个更高温度出现在几天后。1、维护一个递减的单调栈,栈中存放的是温度的下标,维护栈中对应的温度值从栈底到栈顶单调递减。给定一个整数数组,表示每天的温度,返回一个answer。这样就保证了栈中始终是递减的。用单调栈找下一个更大元素/更小元素。单调栈是一种特殊的栈,其中。
2025-12-30 22:41:29
296
原创 hot100-57字符串解码
numStack存储每层的重复次数,strStack存储每层已构建但未完成的前缀字符串。维护两个变量,cur当前正在构建的字符串,num正在解析的数字(可能多位)。遇见 [ ,压栈(两个栈)并重置(两个变量),遇见 ],弹栈(两个栈)并拼接(栈顶+重复的)。(mutable)的,内部用字符数组实现,支持高效追加、修改。2、遇见数字,累加构造完整数字,遇见字母,直接追加到cur。(immutable)的,每次拼接都会创建新对象,效率低。给定一个编码后的字符串,返回解码后的字符串。将字符形式的数字(如。
2025-12-29 10:42:38
197
原创 hot100-56最小栈
1、普通的栈可以实现push、pop、top,都是O(1),而找最小值要遍历整个栈,并且getMin()也要求O(1),所以不能临时计算,要利用一个主栈存储所有入栈的原始数据,同时维护一个最小值栈(栈顶始终是主栈中的最小值)。2、push(val)时,如果 val 小于或等于 minStack 的栈顶(当前最小值),就把 val 也压入 minStack。push(int val)将元素val推入栈中,pop()删除栈中顶部的元素,top()获取栈中顶部的元素,getMin()获取栈中最小元素。
2025-12-28 21:25:37
270
原创 hot100-55有效的括号
给定一个只包括( ) { } [ ] 的字符串s,判断字符串是否有效。利用「栈」(Stack)来模拟括号的匹配过程,遵循“后进先出”的原则。遍历完所有字符后,检查栈是否为空,非空则无效,空则是有效的括号字符串。栈顶的左括号是否能和当前的右括号匹配,不能则无效。3)每个右括号都有一个对应的相同类型的左括号。1)遇到左括号,直接压入栈中,等待后续匹配。检查栈是否为空,没有左括号匹配,则无效。1)左括号必须用相同类型的右括号闭合。2)左括号必须以正确的顺序闭合。
2025-12-28 20:40:41
219
原创 hot100-54在排序数组中查找元素的第一个和最后一个位置
给定一个非递减顺序排列的数组nums,和target,找出给定目标值在数组中的开始位置和结束位置,如果数组中不存在目标值target,返回[-1,-1]。时间复杂度O(log n)。条件中,确保即使找到目标值也继续向边界方向搜索,从而精准定位重复元素的范围,整体时间复杂度为 O(log n)。if (nums[mid] >= target) 等于没有单独拿出来,是因为即使找到了。,也不能停止,还要继续向左找更早的。(左边界),第二次找。
2025-12-26 22:45:02
253
原创 hot100-53搜索旋转排序数组
nums升序排列,值互不相同,经过k次旋转,找出target的下标,如果没有返回-1。是否落在该有序段内来决定搜索方向,实现高效的二分查找。总结:利用旋转数组“两段有序”的特性,通过比较。在哪一段,再决定如何缩小范围。判断哪一半是有序的,然后根据。
2025-12-26 22:25:53
168
原创 hot100-52寻找旋转排序数组中的最小值
因为这道题目不可以排除mid(只有左右两部分),所以right = mid,这种情况下 left=right,容易死循环,left = right = mid,永远在while里,所以终止条件应该是 left = right。1、二分查找,数组虽然被旋转了,但是也保留了部分有序性,数组分为两端升序数组,最小值出现在第二段开头,最小值右边的所有元素小于等于最左边的元素。给定一个长度为n的数组,原本按照升序排列,经过n次旋转后得到的数组,找出并返回数组中的最小元素。比能明确区分左右段;在旋转后可能很大(如。
2025-12-25 21:08:01
148
原创 hot100-51搜索二维矩阵
对于任意一维索引mid,转换为二维坐标,行号:row=mid/n,列号:col=mid%n。2、这个题目的特性是,每行的第一个元素 > 上一行的最后一个怨怒是,说明所有行是严格递增拼接的,使用上面的解法时间复杂度是O(m+n),如果使用二分查找时间复杂度是O(log(mn))。m×n的矩阵,每行中的整数从左到右递增排列,每行第一个整数大于前一行的最后一个整数。给定矩阵和target,如果target在矩阵中,返回true,否则返回false。// 取余 → 得到“在该行中的偏移”→ 向下走(排除这一行);
2025-12-25 20:17:35
380
原创 hot100-50搜索插入位置
6、最后返回left,当循环结束时,left恰好指向第一个大于等于target的元素位置,正是我们要插入的位置。给定升序数组和目标值,在数组中找到目标值,并返回索引,如果目标值不存在于数组中,返回它将会被按顺序插入的位置。时,说明只剩一个元素,仍然需要检查它是否等于 target。1、二分查找中,我们要维护一个搜索范围,,表示初始搜索范围是整个数组。
2025-12-24 22:46:58
161
原创 hot100-49前缀树
2、一种26叉树结构,每个节点代表一个字符,从根到某节点的路径构成一个前缀;通过 isEnd 标记该路径是否为一个完整单词的结尾。1、每个节点,使用定长数组实现子节点映射;isEnd=true属性表示从根节点到当前节点拼出的字符串是一个完整的词。3)startsWith(prefix):判断是否存在以该前缀开头的单词。2)search(word):判断单词是否完整存在于 Trie 中。1)insert(word):插入一个单词。实现一个前缀树类,提供三个操作,
2025-12-23 21:30:58
198
原创 hot100-48课程表
使用拓扑排序,通过构建邻接表表示图、入度数组记录每个节点的依赖数,将入度为 0 的课程加入队列,依次“学习”并减少其后继课程的入度,重复此过程,若最终能处理完所有课程(即访问节点数等于课程总数),说明图中无环,返回 true,否则返回 false。inDegree:入度数组,记录每门课还剩多少先修课程未完成,B还差几门课(还有几门前置课程)才能学。将课程及其先修关系建模为一个有向图,其中课程是节点,先修关系是有向边(如。queue:队列,存放当前可学的课程(BFS遍历),当前可以学的课程。
2025-12-22 22:42:21
337
原创 hot100-48腐烂的橘子
2、遍历网格,将腐烂的橘子加入队列,并且新鲜的橘子计数统计。如果新鲜的橘子为0,那么腐烂的时间为0。如果队列不为空,就BFS传播,从队列中取出当前腐烂的橘子,并将四周的橘子变腐烂。1、DFS是一条路走到黑,从一个腐烂橘子出发,先一路向下感染到底,再回溯。所以这道题要用BFS,逐层遍历,按时间层推进。代码学习的是小红书的尼布斯老师,写的好好,思路写的也好好,很清晰易懂。m x n 的网格 grid 中,每个单元格可以有三个值:0、1、2。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
2025-12-12 23:55:23
349
原创 hot100-47岛屿数量
遇到未访问的 '1' 启动搜索,一层层向外扩展,将整个岛屿的所有格子标记为已访问。都在主函数中遍历网格,每遇到一个未处理的陆地('1')就计数加一,并通过搜索(DFS 或 BFS)将该陆地所属的整个岛屿全部标记为“已处理”,避免重复计数。:DFS 直接将原数组中的 '1' 改为 '0' 来标记访问,不使用额外空间;1、深度优先搜索DFS:遍历网格,如果当前格子是'1',说明找到了一个新的岛屿。递归把上下左右淹没整个岛屿(把相连的 '1' 改为 '0')数组来记录是否访问过,仅对未访问的 '1' 进行处理。
2025-12-10 22:58:26
275
原创 hot100-46二叉树的最近公共祖先
1、递归的过程中,如果p和q位于该节点的两侧,那么该节点就是最近公共祖先。如果再同一侧,那就要继续递归。给定一个二叉树,找出树中两个指定节点的最近公共祖先。
2025-12-09 17:38:13
172
原创 hot100-45路径总和III
2、先序遍历,处理当前节点,更新sum和map,再递归左右子树,到达一个节点时,这个路径应该立即包含它,左右子树才能继续延伸。给定一个二叉树根节点root,和一个整数targetSum,求该二叉树节点值之和等于targetSum的路径的数目。1、使用前缀和+哈希表,dfs回溯。
2025-12-08 22:19:36
188
原创 hot100-44从前序与中序遍历构造二叉树
前序遍历数组的第一个值为根节点,找到根节点在中序遍历数组中的索引位置,分别通过左右子树在前序遍历和中序遍历的索引范围构建左子树和右子树。给出两个整数数组,前序遍历preorder和中序遍历inorder,请构造二叉树并返回根节点。1、前序遍历:根左右,第一个元素就是根节点,中序遍历,左根右,根节点左边左子树,右边右子树。2、遍历中序遍历的数组,记录下值对应的index,便于寻找根节点的索引。递归的种植条件是,前序遍历的左边界>右边界。
2025-12-04 22:43:00
260
原创 hot100-43二叉树展开为链表
找到左子树的最右节点,保存下来最右节点,然后将左子树转移到右子节点上,找到其最右节点,将右子节点设置为保存下来的最右节点。给定一个二叉树的根节点,展开成一个链表。左节点始终为null。当函数为void时,终止递归,可以用return;
2025-12-04 10:05:32
155
原创 hot100-41二叉搜索树中第K小的元素
1、二叉搜索树找第k小的数,中序遍历是升序数组,访问到第k个节点时,它的值就是答案。给定一个二叉搜索树的根节点root,和一个整数k,找出其中第k小的元素。这个代码,找到了第k小的值仍然会遍历整个树。
2025-12-02 20:30:31
146
原创 hot100-41验证二叉搜索树
1、函数的作用判断该二叉树是否是二叉搜索树。二叉搜索树的左子树所有节点的值必须严格小于它,右子树中所有节点的值必须严格大于它。(是整个左/右子树,不仅仅是左右子节点)。只接受一个参数(根节点),所以需要写一个辅助函数,传递min和max信息。所以,需要每个节点都有一个合法区间,根节点的合法区间是。1)每个节点都有一个数据域,且所有节点的数据域互不相同。给定根节点,判断是否有一个有效的二叉搜索树。2)左子树的所有节点的值都小于根节点的值。3)右子树的所有节点的值都大于根节点的值。,右子节点的合法区间是。
2025-12-02 19:56:36
283
原创 hot100-40将有序数组转换为二叉搜索树
1、二叉搜索树的特性是左子树 < 根节点 < 右子树,对于升序数组,选择数组的中间节点作为根节点,左半部分构造左子树,右半部分构造右子树。给定一个整数数组nums,其中元素按升序排列,转换为一个平衡二叉搜索树。
2025-12-02 09:46:50
169
原创 hot100-39二叉树层序遍历
声明Queue类型的引用变量queue,并用LinkedList实例化。4)弹出队列中的节点,将对应的值加入list,并将其左右子节点加入queue。3)每次循环新创建一个list(新的一层),通过长度n控制for循环。将元素加入队列尾部,入队。2)使用一个队列,先加入根节点root,用队列的长度控制循环。等价于queue.add(root);
2025-12-01 17:58:36
394
原创 hot100-38二叉树的直径
经过某个节点的直径是左深度+右深度,这个结果值需要用全局变量来记录,因为他不是返回给父节点的值,父节点需要的深度。所以需要写一个辅助函数,递归深度。二叉树的直径是这个树中两个任意节点的最长路径的长度,两个任意节点的最长路径的长度由他们之间的边数表示。1、递归,二叉树的最大直径为,左子树深度or右子树深度的最大值+1。给定root,返回该树的直径。直径=左深度+右深度。
2025-11-29 16:53:44
199
原创 hot100-37对称二叉树
1、这个函数是给定一个节点判断是否轴对称,不能在这个函数里写递归,因为左子树、右子树不对称,可能整个树是对称的。所以写一个传左右子节点的函数,判断是否轴对称。终止条件:左子节点和右子节点都为null返回true。当左子节点右子节点有一个为null,则不对称返回false,判断左右子节点的值如果不等则返回false。给定一个根节点root,检查是否轴对称。(或两者都真),整个表达式就是。A && B 只有当。
2025-11-29 15:52:10
323
原创 hot100-36翻转二叉树
1、深度优先遍历,递归的方法,终止条件:判断root== null,返回,然后左子节点翻转,右子节点翻转,再分别交换赋值。给定一个root,翻转这颗二叉树,并返回根节点。
2025-11-29 15:13:06
199
原创 hot100-35二叉树的最大深度
给定root,返回最大深度,最大深度指,从根节点到最远子节点的最长路径上的节点数。2、深度优先搜索,深度是左节点深度或右节点深度的最大值+1。
2025-11-28 10:43:29
204
原创 hot100-31排序链表
本题是在归并排序中,希望把链表分成前半部分和后半部分。要拿到slow的前一个节点,从此断开为两部分。把一个大问题不断拆成两个小问题,直到不能再分(通常只剩 1 个元素)。偶数长度的链表,slow停在后半部分的第一个节点。给出链表头节点,按升序排序并返回排序后的链表。把两个已经排好序的子序列合并成一个有序序列。对于数组或链表:从中间切开,分成左右两半。合并过程使用双指针,像拉链一样“拉”起来。奇数长度的链表,slow停在正中间的节点。2、快慢指针找中间节点。借用k神的图,来自力扣。
2025-11-27 10:48:02
339
原创 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
234
原创 hot100-29随机链表的复制
上面的代码是使用hashmap实现的,面某国企考过这道题,当时面试官问,力扣的题目Node类是没有重写equals和hashCode方法的,默认使用了Object类的实现,比较对象的引用地址是否相同,这样即使是两个节点的val相同,他们在内存地址不同就是不同的对象,hashmap也不会覆盖掉。1、遍历链表,用map保存所有原始节点到新复制出的节点的映射,需要根据原节点之间的关系(next和random)来设置新节点之间的关系。链表中,每个节点包含一个额外的随机指针random,构造这个链表的深拷贝。
2025-11-26 11:28:13
326
原创 hot100-28两两交换链表中的节点
1、创建虚拟头节点,记录交换两个节点后面的节点,然后交换两个节点后,pre和head后移。给定一个链表,两两交换其中的相邻节点,并返回交换后链表的头节点。
2025-11-24 11:01:33
251
原创 hot100-27删除链表的倒数第N个节点
1、创建虚拟头节点,利用快慢指针。快指针先走n+1步,然后快慢指针一起走,当快指针走向null时,慢指针走向删除的节点的前一个节点,然后删除掉节点。给定一个链表,删除链表的倒数第n个节点,并返回头节点。
2025-11-24 10:47:28
218
原创 hot100-26两数相加
进位:jin = sum / 10;值的个位:count = sum % 10;从链表头部相加,并且记录进位,移动链表节点指针。两个数相加,返回一个和的链表。
2025-11-23 13:20:00
149
原创 hot100-25合并有序链表
1、初始化创建一个dummy用于返回,然后创建一个cur当前指针,比较两个链表头部当前值的大小,cur去接较小的一个节点,然后链表节点后移,cur当前节点也后移。将两个升序链表合并成一个新的有序链表。
2025-11-23 13:10:15
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅