
LeetCode 热题 100
LeetCode 热题 100
xiaolin0333
在运气还没光临的时候,就保有一个好心态。
展开
-
124. 二叉树中的最大路径和
【代码】124. 二叉树中的最大路径和。原创 2025-02-15 21:23:39 · 476 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
这也说明了:如果返回的是nullptr,说明p、q不在这棵树中。原创 2025-02-15 20:49:29 · 348 阅读 · 0 评论 -
114. 二叉树展开为链表
能不能先序遍历,先处理当前节点(把当前遍历到的节点插入到单链表中),但是这样存在一个问题,此时当前节点的右孩子还没有被遍历到,这样会出现孩子丢失的情况。但是如果是后序遍历的话,结点的顺序应该怎么处理呢?目前节点的顺序是和题目所求的节点顺序相反,因此可以考虑。这样就不会出现孩子丢失的问题,因为当去更新当前的右指针时,已经遍历过他的右节点了。这题要将一个二叉树转成单链表,且展开后的单链表应该和二叉树的先序遍历相同。:题目要求先序遍历(根左右)的结果,那能不能用。原创 2025-02-12 11:42:12 · 244 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
所以可以将数组最中间的数作为根节点,依次把根左边的数组和根右边的数组作为左右节点即可。注意,[l, r)是左闭右开的情况,所以在后边划分区间的时候,也要始终保持左闭右开。二叉搜索树的特征:左 < 根 < 右。原创 2025-02-12 11:08:09 · 241 阅读 · 0 评论 -
102. 二叉树的层序遍历
这题的难点在于,题目要求是要返回一个二维数组,那怎么去记录每一层的节点呢?在每一次循环的时候,当前队列中的节点就是这一层的节点,因此可以用一个tempVec来存储当前队列中的数据,在每一轮的循环结束时,把tempVec插入结果数组中。原创 2025-02-11 11:39:31 · 301 阅读 · 0 评论 -
543. 二叉树的直径
这题要求树的最大直径,其实也就是求树中某一个节点的左右子树的深度之和最大。那么就可以把这个问题拆解成一个个相同子问题:求某一个节点的最大深度。原创 2025-02-11 10:59:33 · 272 阅读 · 0 评论 -
142. 环形链表 II
极端情况:fast进入环时,fast = slow + 1,此时fast以相对速度1远离slow,fast需要走(环长 - 1)步才能与slow相遇,所以慢指针移动的距离 < 环长。如图所示,如果有环,fast 和 slow必会相遇,此时fast走n圈,slow走一圈。为什么slow无法走两圈?原创 2025-02-10 13:29:41 · 363 阅读 · 0 评论 -
146. LRU 缓存
把最下边的数据淘汰掉,再把刚访问的数据放到上边(换页)本质:让不经常访问的数据往下排,经常访问的数据往上排。LRU:最近最少未使用,很少被请求的数据才会被淘汰掉。这样会导致:冷门数据在最下边,热门数据在最上边。hashMap的查询时间复杂度是O(1),可以用。访问的数据缓存中没有。原创 2025-02-10 12:44:17 · 508 阅读 · 0 评论 -
25. K 个一组翻转链表
分类讨论:退出循环有两种情况,原创 2025-02-09 17:28:18 · 401 阅读 · 0 评论 -
24. 两两交换链表中的节点
如图,题目要求前后节点交换,1、2往往容易想到,但是3容易忘记。在(a、b)交换后,此时和前一个节点(c)断开连接了,需要把节点c也接上。直接存储滑动窗口内的字符串,这样虽然方便,但是时间复杂度和k相关,如果k = n,此时会达到O(n^2)的复杂度。原创 2025-02-09 17:20:38 · 402 阅读 · 0 评论 -
160. 相交链表
这题可以将headA遍历完后遍历headB,把headB遍历完后遍历headA,这样就相当于走了同样的距离。不管什么情况,都会退出循环,且都只会遍历(a+b)次,不会有死循环的情况。原创 2025-02-08 19:29:58 · 228 阅读 · 0 评论 -
48. 旋转图像
这题如果直接以行为单位进行旋转,有一部分值会被覆盖。所以我们应该一次旋转一个数字,找到这些数字的关系。原创 2025-02-03 10:00:00 · 238 阅读 · 0 评论 -
54. 螺旋矩阵
这题主要是要抓住循环不变量,每次一圈循环都应该遵循左闭右开的原则。由于题目不一定是个正方形,所以最后要考虑。原创 2025-02-02 14:00:00 · 296 阅读 · 0 评论 -
238. 除自身以外数组的乘积
所以使用前后缀分解,用两个数组分别求nums[i]所有左边数的乘积 和 nums[i]所有右边数的乘积,求结果的时候,res[i] = 当前数字的左边数乘积 * 当前数字的右边数乘积。先用res[i]来存放nums[i]所有左边数的乘积,再用一个常数right来存储nums[i]所有右边数的乘积,一边更新right的值,一边更新到res[i]中。方法1. 前后缀分解 + 两个数组存放前后缀的乘积。方法2. 前后缀分解 + O(1)的空间复杂度。这题的难点在于,不能用乘法。原创 2025-02-02 09:55:10 · 229 阅读 · 0 评论 -
189. 轮转数组
如图所示,这题可以进行三次反转,先把数组全部反转,再反转前半部分,反转后半部分,即可得到结果。原创 2025-01-30 11:29:16 · 395 阅读 · 0 评论 -
56. 合并区间
先把数组按照左端点排序,这样可以保证可以合并的区间是连续在一起的。,就进行合并(合并的时候也要注意判断这两个元素的右端点的大小)原创 2025-01-27 09:43:42 · 424 阅读 · 0 评论 -
53. 最大子数组和
用preSum维护前缀和,然后循环preSum, preSum[j] - preSum[i]就是子数组i到j的和。但是这个方法会超时=。如果sum是负数,说明sum + nums[i]对结果是抑制作用,直接丢弃前边累加的结果。如果sum是正数,说明sum + nums[i]对结果是促进作用;原创 2025-01-26 10:17:08 · 350 阅读 · 0 评论 -
560. 和为 K 的子数组
使用preSum数组来存储nums的前缀和,preSum[i] = nums[0] + nums[1] + …+ nums[i - 1],这里一定要注意,存储的时候必须要从preSum[1]开始存,因为后边计算前缀和的时候,利用的是preSum[j] - preSum[i],得从preSum[1]开始存相减的时候才能不丢失num[i]的值。对于下标为0之前的元素,前缀和为0,个数有1个,这个需要赋初值,后边相加的时候都需要以这个开始。使用preSumCnt的map计算前缀和为key的个数有value个。原创 2025-01-26 09:22:12 · 387 阅读 · 0 评论 -
15. 三数之和
情况2. 当已经找到一个三元组后,可能nums[l] == nums[l + 1],此时都应该使用while循环(可能有多个)排除在外。但是要注意,退出循环的时候,如果是nums[l]!= nums[l + 1],但是此时nums[l] == nums[l - 1],这样就会出现死循环。如果i遍历的元素已经是>0,但是数组又是升序排列,后边不可能有和<0的数字,所以当i遍历到元素>0时,直接break。情况1. nums[i] == nums[i - 1],这种情况可以直接continue。原创 2025-01-24 10:29:16 · 271 阅读 · 0 评论 -
11. 盛最多水的容器
因为可以容纳的水取决于高和宽,初始时,先让宽最大,即l = 0,r = n - 1,每次只要移动更短的木棍,虽然宽在缩小,但是有可能找到比当前更大的高。短板原理:可以容纳的水 = min(height[l], height[r]) * (r - l)原创 2025-01-23 11:55:38 · 205 阅读 · 0 评论 -
283. 移动零
先把非0的元素移到前边,后边剩下的就是0了。原创 2025-01-23 10:19:19 · 248 阅读 · 0 评论 -
128. 最长连续序列
可以把这题理解成,有好多条不同长度的线段,要找到最长那条线,只需要找到所有线的线段头,从头开始计算。如果遍历到2,先判断2前面是否还有数字,由于2前边还有,说明2不是开头,直接跳过后续操作。如果遍历到1,1前边已经没有数字了,说明1就是开头,从头开始计算,看看这个线段长度是多长。这里虽然是两个循环,但是内循环只有遍历到线段头的时候才会执行,所以时间复杂度为O(n),先把这些数存在set中,遍历set。原创 2025-01-23 09:57:08 · 253 阅读 · 0 评论 -
49. 字母异位词分组
字母异位词对应的排序后的字符串是一样的,所以把每个字符串排序后插入以排序后字符串作为key,以原字符串作为value的map中。这个方法虽然简洁,但是取决于每个字符串的长度,排序的时间复杂度是k * logk。方法1:直接对字符串进行排序后使用map存储相同的字母异位词,再把map的value依次存放到结果中。使用每个字符出现的次数 + 字符 作为key。方法2:自定义哈希函数。原创 2025-01-23 08:59:53 · 327 阅读 · 0 评论