- 博客(14)
- 收藏
- 关注
原创 代码随想录打卡DAY15
都是递归但是第一个是不考虑是不是满二叉树的直接递归,第二个是先判断是不是满二叉树,如果是直接2的n次方-1,不是再考虑递归如上,因为总有子树是满二叉树哪怕只有一个节点。层序遍历的时候加上depth++,递归类似求和。222.完全二叉树的节点个数(优先掌握递归)104.二叉树的最大深度 (优先掌握递归)111.二叉树的最小深度 (优先掌握递归)毫无区别就是一个if判断左右都是空就退出。
2024-04-01 21:27:49 297 1
原创 代码随想录打卡DAY14
总之就是先判断是否为空,然后先把根节点加入队列进去,queue可以用linkedlist实现,在队列非空时候然后得到que的size,写一个for循环len长度次数,每次poll一个节点为tmpnode然后把左右节点都加入进去。然后一次offer两个,只有当左右两个都不为空且值相等的情况才继续判断把各自的左右节点加入队列。还是一种递归一种迭代迭代类似层序遍历,只不过从根节点的左右开始因为不需要比较根节点。翻转二叉树和层数遍历唯一的不同就是取出队首节点后交换左右子节点。
2024-04-01 21:13:47 221 1
原创 代码随想录打卡DAY13
迭代的话会比较麻烦要先得到最左的子节点然后pop并且把值add进去都得到它的父节点也就是根,然后再cur=cur.right 得到右子节点。大概就是递归就改一下顺序注意一下List实现方式可以是ArrayList。
2024-04-01 20:37:15 283 1
原创 代码随想录打卡DAY12(栈与队列03)
最近被毕设整得心力交瘁,慢慢恢复到每天刷题和写blog的节奏先补起来!239. 滑动窗口最大值 (一刷至少需要理解思路参考这篇OI wiki的文章我感觉写得很棒,以及这篇很生动形象的知乎文章,大佬真的写得很好名言如下——单调队列的原理主要是要找到有可能的最大值347.前 K 个高频元素。
2024-04-01 19:29:47 334 1
原创 代码随心录打卡DAY11
值得注意的就是运算顺序就是除和减都是第二个pop的也就是先进栈的去除,减第一个pop也就是后进栈的,然后减就改成负的加不然你可能需要赋值毕竟第一个pop的是被减的对象,就像除法一样。本题也是很简单的应用,就是注意charAt方法以及因为要顺序输出最后的结果所以要新String一个字符串每次把pop的内容加在前面。后面是本题思路我们将所有的左括号的对应右括号入栈,然后再判断是否有一样的右括号进入如果有就把这个右括号给出栈,在所有循环过后才能。的所有功能,并增加了基于链表的特性。的关系是实现和接口的关系。
2024-03-28 13:04:52 496
原创 代码随想录打卡DAY10
这题本质上就是两个栈来实现先进先出,入队列就进入stackin 出队列就stackin pop出去push进入stackout 再进行pop,如果出栈没有元素就把stackin的元素全部导入进去。思想就是通过一个辅助队列来实现每次要出栈时候就把queue1中除了最后一个元素全部放到queue2中,这样就可以确保每次都是最后一个元素先出队列实现了栈的先进后出。225. 用队列实现栈。232.用栈实现队列。
2024-03-28 11:23:59 191
原创 代码随想录打卡DAY9
这行代码是 base case,只有遇到 pat[0] 这个字符才能使状态从 0 转移到 1,遇到其它字符的话还是停留在状态 0(Java 默认初始化数组全为 0)。理解了kmp的原理,但是代码怎么写还是没怎么研究清楚特别是next这个数组的构建,后面参考了labuladong的知乎,链接如下。下面这行代码是影子状态更新的关键点因为影子状态的X初始为0,而j初始为1,只有又遇上跟一开始的A影子状态才会移动也就是相同前缀。首先只有遇到 "C" 才能推进状态,遇到 "A" 显然只能进行状态重启。
2024-03-27 19:25:23 929
原创 代码随想录打卡DAY7
454.四数相加II因为只需要输出组合的个数而且不用考虑有重复的四个元素相加等于0的情况,所以只需要定义一个map保存值和个数即可,解题步骤也比较简单就是key放a,b的和,value放和出现的次数,遍历A,B数组把map初始化,再定义一个count来统计a+b+c+d出现的次数,再遍历C,D数组,如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来,主要还是掌握put,getOrDefault这些方法。
2024-03-01 12:55:13 476
原创 代码随想录打卡day6
主要是什么时候用set 什么时候用数组做hash,数组是用下标做key所以最好数字药效,set是去重时用。此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。主要是学到什么时候用map,然后这题key是数组元素 value是下标!主要是判断sum有没有出现过,这样就可以判断有没有出现死循环!
2024-02-28 23:43:06 328
原创 代码随想录打卡DAY4
还是要建立虚拟头结点,这样就不会出现一些越界的事情值得注意的是有了虚拟头结点后fast要走n+1步才能到第n个节点所以第一个for要取等,要删除的节点应该是第m-n个,所以原本是要走m-n+1步,但是我们要走到删除节点的前一个,所以就少走一步fast直接!主要问题还是在于没有判断特殊情况,以及变量声明,像carl老师这种节点定义好并且注释的方法值得学习,我就只写了tmp,tmp1后面感觉写的时候知道是什么,再看就不知道了,最好不要怕浪费空间就first second一个个来。这个公式说明什么呢?
2024-02-26 00:00:15 418 1
原创 代码随想录打卡DAY3
这题有两种方法,双指针法和递归法,双指针主要就是注意改变指向后需要有个指针来保存cur的下一个指针,然后改变指向后,再进行赋值,递归法也是重置指针时就把cur和其后一个传入即可。主要在于学习虚拟头结点的使用,之前用的C写,java因为没有指针的概念所以写起来方便很多,也不用释放内存哈哈。2.对于java类的构造方法还不够熟悉,有时忘记声明变量种类,还有debug时要注意哪些地方取不取等。1.总是不优先考虑特殊情况比如index<0 and index>size。
2024-02-23 23:54:24 480
原创 代码随想录刷题DAY2
carl老师后面两个赋值判断条件用的是loop,我用的是start,就差一所以一个有取等一个没有取等,我个人认为start更直观所以我就用了start,也是可以通过的,还有就是为了让奇数n中间赋值,我觉得我自己还是用mid好一点,不太习惯用start,这样就引用太多次了,而且没那么直观可以看出来start最后是n/2哈哈就是loop的循环次数。这是我第二次写这道题了,我谨遵守着carl老师讲的循环不变量原则,第一次的时候因为代码没理解还看了一遍视频讲解,目前我写改为java作为我的主要刷题语言。
2024-02-22 23:22:42 425 1
原创 代码随想录打卡DAY1
今天复习了一下二分法和双指针,因为之前用python刷过所以转java之后也是快速地过了一下,再手敲一遍熟悉一下代码,然后主要是还是要注意一些越界的问题,自己写可能就注意不到,贴一下代码吧,双指针解决移除元素还可以通过相向双指针法,会遍历更少的元素。代码如下。
2024-02-21 21:46:59 412
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人