
新坑 刷题
目标大厂, 我要赶紧提升起来,每天坚持
月亮被咬碎成星星
热爱编程 探究程序技术
展开
-
LeetCode[513]找树左下角的值
找树左下角的值,有可能这个值不是左叶子节点,可能是右叶子节点,但怎么说这个值都是叶子节点,首先这道题用层序遍历的思路比如什么队列和BSF的递归都可以做,但我比较喜欢用纯递归来搞,因为这道题不需要处理根节点,所以前中后序遍历都可以,我们只要模拟层数,然后找到叶子节点即可。原创 2025-06-04 21:12:37 · 26 阅读 · 0 评论 -
LeetCode[404]左叶子之和
题目要求求出左叶子的和,左叶子的条件是左右节点为空且是左子树的叶子节点才叫左叶子节点,那么右子树的左叶子节点的和是什么呢?这样想就引出了递归的顺序,后序遍历,求出左右子树的节点和,再算根节点。遍历时加上条件,如果是左叶子节点就算在根节点头上,因为这时候根节点这棵树的和就是左叶子的和了。原创 2025-06-03 21:38:14 · 272 阅读 · 0 评论 -
LeetCode[257]二叉树的所有路径
这道题是要求出根节点到叶子节点的路径,那不用想了,肯定是根左右,也就是前序遍历来搞,既然我们已经明确了是前序遍历来搞,那么就该考虑是纯递归还是回溯了,其实这道题回溯和递归都可以,我这里就主要将回溯了。回溯首先就要明确退出递归的条件是什么,肯定是左右子节点都为空,这就是叶子节点的情况,我们可以直接计算结果添加到结果集中,然后递归左右子树,递归之后做回溯,就是这么简单,递归和回溯是同时进行的。原创 2025-05-31 18:44:36 · 262 阅读 · 0 评论 -
LeetCode[110]平衡二叉树
本题解法依旧是后序遍历,采用左右根来解决,如果你要采用前序遍历什么的,你需要先计算根节点,那根节点的计算又要计算子节点,然后再递归左右,这样子节点就会被重复计算,对时间复杂度来说不太友好,属于O(nlog(n))时间复杂度。但采用后序遍历就不一样了,只需要把每个节点都遍历一下就能得出答案,所以时间复杂度为O(n), 高下立判。原创 2025-05-31 15:33:39 · 258 阅读 · 0 评论 -
LeetCode[222]完全二叉树的节点个数
完全二叉树的性质是:我简单说一下,大概就是其他节点都满了,就是只缺右面的叶子节点,右面叶子节点缺多少都行,只要不是左面少节点就行。这个节点个数可以使用递归左儿子个数+递归右儿子个数+1,这个1是根节点,最后结果为节点个数,但我们没有练习到完全二叉树的性质.知道了这个性质,就直到完全二叉树是由满二叉树组成的,那么我们直接求满二叉树的节点就行,满二叉树的节点数量为depth*2-1。原创 2025-05-22 21:33:43 · 314 阅读 · 0 评论 -
LeetCode[111]二叉树的最小深度
这道题中最小深度和最大深度可不一样,最大深度定义就是求最大深度,而最小深度的定义是找到最近叶子节点的最小深度,也就是说如果左右节点有一个为空,那么这个空节点并不能算作一个叶子节点。所以我们要将这种情况排除,那么答案就物质欲出了。原创 2025-05-22 21:02:33 · 85 阅读 · 0 评论 -
LeetCode[104]二叉树的最大深度
二叉树的最大深度是算左右节点哪个深度最大,dfs直到最深处,递归时也要把当前节点算上,一个节点的树深度是1,别忘记了。原创 2025-05-12 23:03:13 · 73 阅读 · 0 评论 -
LeetCode[101]对称二叉树
对称二叉树是左右子树对称,而不是左右子树相等,所以假设一个树只有3个节点,那么判断这个数是否是对称二叉树,肯定是先判断左右两个树,然后再看根节点,这样递归顺序我们就确认了,是后序遍历。那么根据遍历顺序,我们可写出递归函数,递归函数的中止和放行条件就是第二步了,这一步可以看代码。原创 2025-05-12 22:52:35 · 312 阅读 · 0 评论 -
LeetCode[226] 翻转二叉树
使用递归,归根结底还是左右节点互相倒,那么肯定需要一个temp节点在中间传递,最后就是递归,没什么说的。原创 2025-05-08 20:17:28 · 235 阅读 · 0 评论 -
LeetCode[102]二叉树的层序遍历
我使用java来做的,结果集是两个List集合,那么我们是不是应该每到新的一层就给这个结果集添加一个内部的List,那么怎么判断左右节点在同一层级呢?我想的就是模拟一个层级的参数为k,root的左右节点都属于一个层级,那么递归的时候对应的就是k+1;以此类推,拿到结果。题目描述从左到右一层一层的进行遍历,就遍历二叉树的这种题我更喜欢用递归来做,原创 2025-05-02 16:07:35 · 281 阅读 · 0 评论 -
LeetCode[94]二叉树的中序遍历
二叉树中序遍历是左根右,递归先左节点,再根节点,再右节点。原创 2025-05-02 15:42:45 · 71 阅读 · 0 评论 -
LeetCode[144]二叉树的前序遍历
前序遍历是根左右,递归遍历的时候,先添加根部,再递归左,再递归右。原创 2025-05-02 15:36:52 · 79 阅读 · 0 评论 -
LeetCode[347]前K个高频元素
使用小顶堆,最小的元素都出去了,省的就是大,高频的元素了,所以要维护一个小顶堆,使用map存元素高频变化,map存堆里,然后输出堆的东西就行了。原创 2025-04-29 21:39:28 · 333 阅读 · 0 评论 -
LeetCode[225]用队列实现栈
题目中说可以给我们两个队列来实现,但其实一个队列就可以实现了,poll的时候就是栈头,也就是队尾元素,那么我们如何获得队尾元素,我们直接让队尾前面的元素重新入队不就完了嘛!找栈顶元素和找队尾元素是一样的,一样的操作。原创 2025-04-20 14:46:20 · 255 阅读 · 0 评论 -
LeetCode[232]用栈实现队列
一道很简单的题,就是栈是先进后出,队列是先进先出,用两个栈底相互对着,这样一个队列就产生了,右栈为空的情况,左栈栈底就是队首元素,所以我们需要将左栈全部压入右栈,右栈不为空,那么右栈就是之前压入过,这时右栈栈顶元素就是队首元素,大家画画图应该就明白了。原创 2025-04-20 13:42:49 · 251 阅读 · 0 评论 -
LeetCode[459]重复的子字符串(KMP解法)
最近迷上了KMP算法,所以这道题也是来搞一下KMP算法,总所周知KMP是需要维护一个前缀表,KMP算法不是比较一个字符串包不包含另一个字符串的吗,这个重复字符串的题也能用?前缀表的最后一个位置就是当前字符串的最长前后缀,如果字符串是由重复字符串构成的,那么字符串长度减去最长前后缀的长度,即剩余子串的长度,如果总长度%子串长度等于0,那么这就是重复的子字符串。我模拟的前缀表就是从0开始的,没有什么右移, -1啊什么的,就是普普通通的前缀表。前缀:不包含后缀的字符串。后缀:不包含前缀的字符串。原创 2025-04-19 23:14:38 · 314 阅读 · 0 评论 -
LeetCode[28]找出字符串中第一个匹配项的下标(KMP版本)
因为这个前缀表是维护了当前模式串最长前后缀,一旦出现不相等的情况,就可以根据不相等的位置的前一个位置的下标的值,就是需要回退的次数。我的理解就是先想KMP算法的时间复杂度,是O(n+m),那么就是一个串遍历一遍,给出的文本串遍历一遍,给出的模式串遍历一遍,所以通过时间复杂度就知道这道题大概的一个for循环的方向,肯定是先遍历模式串算出前缀表,然后再遍历文本串结合前缀表得出答案。那么说说前缀表怎么算出来的,遍历模式串,然后再来个双指针,初始的时候,头指针指向前缀的头部,尾指针指向后缀的尾部。原创 2025-04-16 23:47:28 · 334 阅读 · 0 评论 -
LeetCode[541]反转字符串Ⅱ
第一就是大于等于k就反转k个,我们for循环肯定是i+=2k了,接下来就是判断是否大于等于k,大于等于就反转,头是i, 尾是i+k。题目给我们加了几个规则,剩余长度小于2k,大于等于k就反转k个,小于k就全部反转,我们按照这个逻辑来就行。第二就是小于k,我们就直接头是i,尾是长度-1。原创 2025-04-14 22:26:15 · 270 阅读 · 0 评论 -
LeetCode[18]四数之和
做四数之和之前,我还真没想到能用三数之和来做,这三数之和真是白做了。0.0,四数也就是比三数多一个数而已,这个数再用for循环了便是,剩下的还是和三数之和一样,就剪枝也是和三数之和差不多,唯一区别就是这个不是四数相加等于0,而是四数相加等于一个target,第一个数比target大,这个显然行不通,因为第一个数可能是负数,比如-4,-1,0,0,-5,target=-5,那么第一个数明明可以,但却被我们剪掉了,这是不可以的,所以我们必须保证第一个数为正数的时候再和target进行比较。原创 2025-04-14 21:50:22 · 255 阅读 · 0 评论 -
LeetCode[15]三数之和
相等添加到结果集后,我们头尾指针都要向内部移动一位吧,那么当尾指针和尾指针的前一个指针一样,那么就要给尾指针去重,头指针同理如果和头指针的后一位一样,那么头指针一样要去重,这样我们三个指针都去重过,我们的答案也就毋庸置疑了。首先一个节点来进行数组的遍历,这个节点也相当于三数之和的第一个值,两个指针分别代表另外两个值,left指针和right指针就肯定在第一个值后面的数组中遍历了,具体怎么遍历呢,就是一个在新数组的头遍历,一个在尾部遍历。这样头尾指针移动就出来结果了,但是这个结果准确吗?原创 2025-04-01 23:30:05 · 276 阅读 · 0 评论 -
LeetCode[383]赎金信
太简单了,没啥思路,就是暴力使用哈希表,遍历第二个数组记录都有几个值,再遍历第一个数组,相同值对应的数就减去,如果最后数组有负数,那么就gg了,如果没负数就ok。原创 2025-04-01 22:19:07 · 270 阅读 · 0 评论 -
LeetCode[344]反转字符串
思路就是没啥思路,直接秒了,搞个双指针,异或可以解,但是代码不太好理解,我就写个简单的代码吧。原创 2025-03-21 18:02:56 · 112 阅读 · 0 评论 -
LeetCode[454]四数相加Ⅱ
可以,我第一次尝试把四次方简化成二次方,但是我们一共四个数组,怎么简化成二次方,那我们就把四个数组看成两个数组,这样我们就可以使用二次方进行求解了,每两个数组进行一次n方。这道题也是一道哈希题,我们面对哈希题就可以使用数组,set和map,因为我们需要统计有几个原组和前两个数组的和,所以我们使用map来搞。后两个数组使用n方进行和的相加,如果我们想结果=0,那么前两个数组和后两个数组的和一定是相反数,如果相加=0了,那么我们就将一开始存的value相加到结果中就行了。原创 2025-03-21 17:36:34 · 240 阅读 · 0 评论 -
LeetCode两数之和
这种题就是哈希题,可以使用哈希来解决,哈希就可以分为数组,set和map,因为我们这到底要记录数组下标和下标对应的数,所以我们需要选择map来解决,我们遍历这个数组,每遍历到一个数都和target减一下,减之后的这个值我们设置为balance,如果这个map中有这个balance,我们就可以返回当前的下标和map中对应数字的下标。如果map中没有这个balance,那就把当前数字和下标存入map中就可以了,直到找到两数之和。原创 2025-03-21 17:27:51 · 265 阅读 · 0 评论 -
LeetCode[349]两个数组的交集
一字:暴力 QAQ,就俩set,两个数组往里扔,然后俩set一个retainAll, 然后再把set转换成int数组,使用stream看着好看点。原创 2025-03-20 20:43:47 · 87 阅读 · 0 评论 -
LeetCode[242]有效的字母异位词
因为这道题都是字母,范围比较小, 我就使用数组来操作了,26个字母,数组长度26,遍历字符串的每个字母,让它减去char的a,这就是数组下标,你要问为什么?那就是因为s.charAt(i)如果是a,那么减去a就是0,如果是b减去a就是1。遇到这种字母异位啊,比较字符串啊,就可以想到数组比较,或者set啊,map啊,都可以。原创 2025-03-20 20:24:48 · 202 阅读 · 1 评论 -
LeetCode[02.07]链表相交
说实话,一开始我没想出来为什么O(n+m)能遍历出结果,然后我看了解析,我的理解就是A链表跑完就去跑B链表,B链表跑完就去跑A链表,那总长度是一样的,跑完一圈还没有一样的,那就是不相交。那为什么跑完一圈会有一样的case呢?因为两个链表相交部分长度相同,不相交部分长度不同,两个链表相互跑就会形成一种快慢指针的感觉,这样就会导致出现相同节点的情况。原创 2025-03-18 23:06:37 · 179 阅读 · 0 评论 -
LeetCode[19]删除链表的倒数第N个节点
要想一次循环,一趟遍历完,那肯定是要想到双指针了,但是双指针怎么做呢?题目给出删除倒数第N个,我们如果能找到倒数第N个节点的前一个节点就行了,倒数第N个肯定是倒着数,那我们就让两个指针中间就差N个单位,当快指针走到链表最后一个的下一个null节点时,这时候慢指针就是倒数第N个节点的前一个节点了,因为快慢指针始终相差N个节点。原创 2025-03-17 21:46:41 · 212 阅读 · 0 评论 -
LeetCode[24]两两交换链表中的节点
就对于这种头节点发生变化的, 我觉得一般都需要一个虚拟头节点,然后无非就是让虚拟头节点的后两个节点进行交换,即找到要交换的两个节点的前一个节点,然后每次循环的时候都要记住这点,这道题就很简单了。原创 2025-03-17 20:53:55 · 276 阅读 · 0 评论 -
LeetCode[206]反转链表
这种题一开始我老想着用三个节点来搞,最后发现可以先两个节点试试,然后不行再三个节点,(但还是用三个节点QAQ),要反转链表肯定要搞个虚拟头节点,但是虚拟头节点还不能有数,那就设置虚拟头节点为null就行,然后剩下就是3个节点互相倒,没啥难度。原创 2025-03-17 20:36:59 · 271 阅读 · 0 评论 -
LeetCode[59]螺旋矩阵Ⅱ
第一个大循环先遍历圈数,一共遍历n/2圈,如果是奇数那就最后处理中间那个小点就行,然后是在每一圈有四条边,我们对每一条边进行处理,每条边采用左闭右开的区间,每条边的最后一个点交给下一条边来进行处理,这样代码就不会乱了。这种题我第一次确实没做出来,第一次做的时候一圈一圈处理,发现圈数越往里,越乱,原来之前是没从圈数开始遍历。原创 2025-03-17 20:25:57 · 240 阅读 · 0 评论 -
LeetCode[707]设计链表
一道中等难度的设计链表题, 一开始我给题想复杂了,我自己设计个双端链表,给我弄的有点迷糊,最后简化成单向链表来做,且只需要一个虚拟头节点即可,主要就是考虑好边界问题,在用下标来操作节点的时候都要拿到操作节点的前一个节点,这样才能操作。原创 2025-03-15 23:58:25 · 119 阅读 · 0 评论 -
LeetCode[203]移除链表元素
我是设置一个虚拟头节点,再设置一个用来遍历的节点,如果当前遍历的节点值和target一样,就让当前节点向下跳两个位置,如果不一样,就让当前节点走一步,设置虚拟头节点就是能省去一步判空操作。原创 2025-03-15 19:30:59 · 218 阅读 · 0 评论 -
LeetCode[209]长度最小的子数组
主要思路就是搞一个滑动窗口,如果滑动窗口中的和大于了target,那么就让滑动窗口的头部往前走一步,如果等于target就更新数组长度,如果小于target就更新滑动窗口末尾,这样就能使用nlog(n)的时间复杂度来解决这道题。老套路,我发现了,最近做的数组题,做不出来可以想一下双指针,如果这道题暴力遍历的话肯定很慢了,但是如果使用双指针维持一个滑动窗口的话,就会快很多。原创 2025-03-15 17:41:48 · 106 阅读 · 0 评论 -
LeetCode[977]有序数组的平方
如果想用一次for循环来搞出来就使用双指针的思想,具体做法就是两个指针一前一后,互相比较,根据题目要求的顺序来进行指针的移动。原创 2025-03-13 21:17:29 · 99 阅读 · 0 评论 -
LeetCode[27]删除元素
遇到这种删除元素的题目,不论是链表还是数组都可以想一下双指针解法,快指针用来遍历,慢指针用来更新数组结构。原创 2025-03-13 20:57:15 · 112 阅读 · 0 评论 -
LeetCode[704]二分查找
使用左闭右闭,while循环,终止条件就是左右区间一样了,就直接终止,如果到这里还没找到target就返回-1,如果找到了就直接返回mid。原创 2025-03-13 20:23:49 · 205 阅读 · 0 评论