- 博客(167)
- 收藏
- 关注
原创 【力扣hot100题】(039)二叉树的直径
我想了很久,发现如果当前节点没有右节点,就将它的右长度设为0,左节点同理,并且在递归是不会加一,而是将加一的操作放在有左右节点、从左右节点递归回来后。(而计算深度只需判断当前节点是否为空)这题在简单题中有点难度,主要是不要把边数和深度搞混(我就这样)。
2025-04-02 16:00:53
70
原创 【力扣hot100题】(036)二叉树的最大深度
其实这个方法在空间复杂度上不如dfs(时间复杂度一样都是o(n)),而且也更复杂。广度优先就是构造一个栈,每次完栈底压入栈顶元素的左右子树,然后删除栈顶元素。这里学到的是每次记录栈元素,这样就不会不同层的元素搞混。用递归的方法没什么好说的,说一下学到的广度优先bfs。
2025-04-02 14:00:26
137
原创 【力扣hot100题】(035)二叉树的中序遍历
原理如下:每次循环先尽量将目前节点入栈并左移,没有左节点时回到栈首节点将目前节点放入结果容器中并移出栈外,目前节点变为该节点的右节点,循环结束条件是目前节点为nullptr并且栈空。正常方法递归很简单,于是又学了一种栈的方法。
2025-04-02 13:43:29
46
原创 【力扣hot100题】(034)LRU缓存
优化方案一:将头指针和尾指针都设成虚拟指针,一个指向双向链表头部的前一个位置,一个指向尾部的后一个位置。(我写的时候为了节省空间复杂度只弄了一个头虚拟指针,还是太不敢了)看了答案,其实有更好的做法,可以优化并且降低代码的复杂度,感觉我写代码还是太畏缩了。优化方案二:构造更多的函数,这样就可以直接调用,代码逻辑会清晰很多。于是按这个改进思路又写了一遍,果然简单多了……做完这题已经没有任何力气写链表题了。思路很简单,就是调试特别的痛苦。
2025-04-02 11:22:50
64
原创 【力扣hot100题】(033)合并K个升序链表
想法十分简单粗暴但有效,将首个链表头作为起点,然后依次遍历各个链表,每个链表再将节点依次插入首个链表中。
2025-04-01 22:45:37
132
原创 【力扣hot100题】(032)排序链表
这种排序对链表来说真的是个很不错的选择,因为链表二分可以用快慢指针,合并之前做过,很好做。大致思路是递归,将链表不断拆分为小块,每块进行排序后合并新块。看了答案,归并排序真的是一个很好的解法。挺难的,主要是对排序算法不熟悉。
2025-04-01 21:54:53
261
原创 【力扣hot100题】(031)随机链表的复制
想法是使用哈希表,先拷贝一遍每个节点和它的next,并记录在哈希表中,之后再拷贝一遍random,用hash找出对应的复制节点。这道题确实有点难度。
2025-04-01 11:36:24
85
原创 【力扣hot100题】(028)删除链表的倒数第N个节点
怕越界所以先定义了一个头结点的头结点,然后定义快慢指针,快指针先走n步,随后一起走,直到快指针走到头,删除慢指针后一个节点即可。链表题还是太简单了。
2025-03-31 22:35:39
157
原创 【力扣hot100题】(025)环形链表Ⅱ
要找到一点规则就是两个指针相遇时slow遍历完循环环走的步数等于head距离环开头的步数。列一下方程:设环长c,头节点至环开头h,直到相遇,slow走了x,fast走了y。就可以得知x=c,x到环开头的距离为c-h,也就是要再向前走h步。栈那个不用说,双指针这个还是改了不少的。和上一题一样的两种思路。y=2*x(由快慢指针)
2025-03-31 20:40:40
145
原创 【力扣hot100题】(023)回文链表
答案里递归的思路也很巧妙:先记录第一个节点,不断递归到最后一个节点,比较记录值和递归位置的节点值是否相等,递归回来的过程中不断比较,并且记录的节点不断后移直到最后递归到最初的节点,记录的节点变为最后的节点。直接用栈,和转化为数组再双指针差不多。
2025-03-31 14:50:18
127
原创 【力扣hot100题】(022)反转链表
非常经典,我写的比较复杂,一直以来的思路都是这样,就没有去找更简单的解法:(做链表题习惯加头结点的前置节点了,去掉也行)
2025-03-31 11:32:41
312
原创 【力扣hot100题】(020)搜索二维矩阵Ⅱ
记起来了二分查找中left和right不能只是等于mid,而是要在mid的基础上加或减,不然会死循环,并且跳出while的条件不能包含left==right,两者相等的情况下还要继续二分。lower_bound是一个二分查找的逃课函数,传入始末向量和target,就可以二分搜寻出最接近target的不小于target的元素,如果没有将返回end()。一开始以为一行的末尾小于下一行的开头,于是傻傻的写了两二分查找,所幸的是发现了自己在二分查找上确实不怎么熟练,巩固了一下知识。
2025-03-31 10:31:53
332
原创 【力扣hot100题】(019)旋转图像
理解了思路还是好做的,每个小循环转一圈,大循环代表转的第几圈。小循环循环n-2i-1次,大循环循环(n+1)/2次。比较考验脑子转不转得过来,最好先在纸上画一下图整理思路,不要和我一样上来就无脑套循环。
2025-03-30 15:11:47
189
原创 【力扣hot100题】(018)螺旋矩阵
老是频频出错,一开始用的递归,遍历完的行/列就在原矩阵中去掉,不知道为什么老是在最后一个元素出错,反反复复改了很多遍,后来发现应该是去掉每一行的最后一个元素时行数不为零导致又会递归几遍,然后原来删除的数还在内存中又被遍历了,导致某些元素被遍历多次。题目不难,但做的过程很痛苦。
2025-03-30 14:21:40
229
原创 【力扣hot100题】(016)缺失的第一个正数
相当于把第二个思路优化了一下,不额外建立哈希表,而是将原数组当作哈希表,第i个位置存放的是数i+1,不过这个代码时间复杂度是o(n)确实震惊到我了。排个序时间复杂度就o(nlogn)了,肯定不符题意,但还是过了。同样是很简单的思路,如果这题没有限制条件那么就是道简单题了。第一个思路:你不仁我不义,直接排序后遍历(时间不符题意)题目里这么多条条框框……先不按条条框框做了两下。第二个思路:哈希表(空间不符题意)第三个思路:答案思路,原地哈希表。
2025-03-30 10:56:56
202
原创 【力扣hot100题】(015)除自身以外数组的乘积
从前往后遍历容器,用一个容器用于记录当前元素前所有数的乘积,之后再从后往前遍历,记录当前元素后所有数的乘积,当前元素的result就是两个容器对应位置的乘积。想了半天,所幸还是想到了。
2025-03-30 09:36:24
151
原创 【力扣hot100题】(014)轮转数组
先储存起后k个元素,然后从第nums.size()-k处一一后移,最后将储存元素替换原来的前k个元素即可。
2025-03-29 20:59:55
297
原创 【力扣hot100题】(013)合并区间
方法就是直接sort之后循环,每次循环找后面的元素直到不能合并(直到后面元素的前一个小于目前元素的后一个),然后目前元素瞬移为遍历到的那个元素。一开始并不相信直接sort会更快,于是一直在试map……
2025-03-29 20:50:22
256
原创 【力扣hot100题】(012)最大子数组和
看了一下以前的解法,然后想到了一种新的思路:设置一个最小元素和设置一个最大元素和,最小元素和是每次求前面所有元素和的时候保留最小的那个值,最大元素和是结果,每次判断截止到这个元素之前所有元素和减去最小的元素和。之前的解法也很巧妙,不知道是看评论区哪个大佬写出来的,也是每次求一下截至目前所有元素的和,如果遍历到的这个元素比前面所有元素和都大就舍去前面的元素,只取最大的这个,然后每次和result比较。
2025-03-29 19:23:20
278
原创 【力扣hot100题】(011)最小覆盖子串
将t里的字符构建unordered_map记录每个字母出现的频率,然后遍历s,如果map里有出现该字符就频率减一并判断map中所有元素均有,如果包含了map中所有元素就从最前再次遍历,看看最短可以截取到哪里。翻看了去年的记录,那时候还是个不会用map只会用数组记录的小萌新,数组的话每次要遍历整个数组,用时肯定会很长。方法是普通的滑动窗口,一开始想这个思路得遍历很多次hash感觉非常容易超时,事实证明并不会。感觉越做越熟悉了,去年做的时候非常痛苦,这次思路清晰了不少,好事。
2025-03-29 17:59:30
214
原创 【笔试记录】饿了么3.28笔试(算法工程师)
还学到了一个质数的判别方法,埃拉托斯特尼筛法(Eratosthenes Sieve),就是先将区间内所有质数做标记,后续判断一大堆数字是不是质数就可以直接看标记,对于要一下判断很多质数的场合可谓是非常有用。(顺便感叹一点这几次笔试都没有考到动态规划那些难题,基本都是考验基础+思维,最多也就考了贪心和单调栈那些,挺奇妙的,果然基础打牢比什么都重要)这一次依旧很力不从心,算法题居然一道题都没写出来(没有签到题,看来算法岗位确实对算法要求高),非常的烦躁就提前交卷了。(冒死截了图,主要是当时想得脑袋都要烧了)
2025-03-29 13:32:57
1015
原创 【力扣hot100题】(010)滑动窗口最大值
在前几天笔试的时候做到了差不多的,就是将元素按顺序排,每次加入新元素时检查前面元素是否大于(小于)该元素,这样就能保持队列的单调性,然后要取最大(最小)值的时候直接取最前面的元素就行。(这道题每次取出元素前要判断队前元素序号是否超出滑动窗口前端)需要用到一个新的东西deque(双端队列),笔试时使用的是stack(栈)。总之还是学到了新东西的,以前确实很少用过这个。
2025-03-28 15:41:17
227
原创 【力扣hot100题】(009)和为K的子数组
总之就是记录每前n个子串的和,然后使用hash存储和为某个值出现的次数,每次求得新和就看看是否存在前面新和-k的字符,有的话加上数量就行。还是太菜了(我),写了半天滑动窗口,然后看了答案又写了半天时间超限……
2025-03-27 21:01:22
155
原创 【力扣hot100题】(008)找到字符串中所有字母异位词
一开始想法是构建map,记录每个字母出现的位置,后来想了好久滑动窗口该怎么移动。后来看了答案才明白滑动窗口是固定的啊啊啊,每次向右滑就两指针同时右移就行。为什么我做了这么久……我果然还是太菜了(点烟)。
2025-03-27 20:17:04
156
原创 【力扣hot100题】(007)无重复字符的最长子串
知道方法但一直在找怎么判断边界,其实根本不用考虑那么多,最后统一取最大值就好了。总体来看还是简单的,只是在某些细节方面花太多时间了,思维太乱,头痛。评价是想不出来哪些细节错了的时候输出一下参数就好了。十分痛苦的一题,做得我阵阵死意。
2025-03-27 15:33:24
176
原创 【力扣hot100题】(006)接雨水
很简单的困难题,和那道盛水的题目差不多,使用双指针往中间靠拢。需要注意的是这个minheight只能升高不能降低。
2025-03-27 14:05:38
216
原创 【力扣hot100题】(005)三数之和
然后对后面的数使用双指针时也要进行去重工作,在每次找到一个结果三元组后移动双指针时一定要将两个指针移动到与之前元素不等的位置,这样才能保证没有重复元素。一开始主要是在思考怎么实现“三指针”,后来想到可以遍历一遍数组,每一遍都当成是双指针就行了。需要注意的是在每次遍历时一定要后移到与当前位置不相等的地方,不然就会重复。个人感觉这道题最大的难点在“不重复”。
2025-03-27 13:45:03
183
原创 【力扣hot100题】(004)盛水最多的容器
解法也是非常简单,使用双指针,因为水桶装的水取决于最短的那块木板,所以每次只要前移最短的那块板子,一直移动到比当前这块板子大,反反复复。总之印象太深了不会都不行啊!记得当年是想到用各种动态规划回溯等等等等最终发现是最简单贪心和双指针。犹记得这题是当年开启我用优快云记录leetcode日记历史的开端。现在能这么快做出来纯粹是因为当时做的时候给我的印象实在太深了。每次移动完就比较一下最终结果。
2025-03-27 10:58:09
209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人