- 博客(13)
- 收藏
- 关注
原创 发布算法训练营第15天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的所有节点个数
这一题我用自己的思路写了下,发现在leetcode上有个别case通过不了,主要是是否左叶子的判断逻辑上有问题,我是剔除右叶子的方式,但是应该没剔干净。看了老师的代码,原来只要在单层递归逻辑里找出左叶子节点就ok了,尴尬。这一题,主要是没想到如果某一层比较出来是非平衡二叉树时怎么返回,看了解答才知道用一个数值标记下然后返回就好了,真是太机智了。这个题严重怀疑是贴错地方了,是不是在前面课程里就可以做的了,简单的一个递归搞定了,单层递归里的逻辑也很简单。222.完全二叉树的节点个数。257.二叉树的所有路径。
2024-11-28 13:58:12
179
原创 算法训练营第14天|226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
这一题我听完了算法公开课,花了很长时间试着理解为什么对比的一定是左子树的left和右子树的right,也就是左子树的外侧和右子树的外侧,在一开始树只有三层的时候,我能够理解是比较左子树的left和右子树的right,然后我一直以为如果树的层数多了之后,比如有更多层,这时候还是这样比较吗?感觉越来越难了,树里面最难以理解的我觉得还是对于递归,而且似乎每天抽一点点时间并不能很好的完成打卡的内容,今天又在补昨天欠的了,不管怎样,还是继续坚持吧,加油!104.二叉树的最大深度。这题没太懂,留着坑待填。
2024-11-27 11:03:40
230
原创 算法训练营第13天|树的递归遍历、层序遍历
遍历顺序,只需要记住前中后针对的仅仅是中间节点就好了,并且左子树肯定是在右子树之前,昨天有点事耽误了,先补上树的递归遍历,后面再补迭代遍历和层序遍历。所以是中左右、左中右、左右中三种,对应前序、中序、后序。
2024-11-26 09:22:22
99
原创 算法训练营第11天|150. 逆波兰表达式、239.滑动窗口的最大值、347.前K个高频元素
这一题乍一看挺懵逼,不知道从哪里下手,多读了几遍题目后,渐渐的有思路了,其实就是按照计算机的思维,碰到计算符号就处理掉,要处理的两个元素就是栈顶的前两个元素,用相应的运算符号计算,只不过要注意的是计算出来的结果要压入栈顶,参与下一次符号的运算,还有个点就是栈顶弹出的元素,第一个是符号运算的后面的数,第二个才是符号运算的前面的数,我一开始就弄反了,导致有些用例过不去。第三题,前K个高频元素,对于大顶堆和小顶堆,还没有理解清楚,先把坑埋了,后面再填吧~~留坑,下周一或者周二来填....
2024-11-23 21:32:53
515
原创 算法训练营第十天|232. 用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中相邻的重复字符项
今天是第十天,主要是栈和队列的基础用法,上来的概念和基础题232和225实际考察的是对栈和队列的基础用法的掌握程度,主要是相应的pop(),push(),top(),peek()等几个方法,整体难度不难,要练练手。这一题要注意的地方是栈里存的是左括号对应的右括号,接着遍历的时候,要先用peek()比较栈顶元素和遍历出的元素,一致后在用pop()弹出。昨晚上面的题,再做这一题,直接秒了,要注意的点是最后遍历栈组成新字符串时是要从栈底开始拼,而不是从栈顶开始,否则字符串就反了。
2024-11-22 14:35:50
194
原创 算法训练营第九天|151. 反转字符串中的单词、卡码55.右旋字符串
我用的substring()方法加上StringBuilder的append(),空间复杂度应该也算是O(1)吧,毕竟只有一个sb对象,两次substring的string对象,再加最后输出的toString()对象,不太确定...今天是算法训练营第九天,事情比较多,两个题目都用的比较懒的方法,先打个卡吧。还是substring()神器,咔咔一顿操作。
2024-11-21 15:38:39
148
原创 算法训练营第八天|344.反转字符串、541.反转字符串II、54.卡码网-替换数字
今天是第八天,字符串的内容,相对来说比较简单,可能是因为对字符串操作的比较熟悉吧,有个要记的点是541这题,我把字符串反转结尾的边界搞错了,k的2倍,代码原先写成了看k*k..耽误了一些时间调试,手还是有点生。至于54题,我偷个懒直接用replaceAll方法了,看了Carl老师的题解,能看懂,写代码的话不太想写了....
2024-11-20 10:49:24
178
原创 算法训练营第七天|454.四数相加II、383.赎金信、15.三数之和、18.四数之和
不过我看了Carl老师的文字解答,还是用的int[]数组,用数组下标0~25表示对应的26个字符,也可以解决,就是有点不太认同的是讲解里说用int[]数组会比用map高效,仅就这个题目来说,用map的话,如果magazine里的不同字符数超过12个的话,map占用的空间并不会更多吧,毕竟只用维护一个16长度的数组并且这些字符出现哈希碰撞的可能性几乎没有,也不存在维护红黑树的情况吧,链表上也只有一个数值,都不会出现链表转红黑树的情况。果不其然的悲剧了,超时。虽然我的超时了,也把这个代码一起贴上吧。
2024-11-19 15:46:27
240
原创 算法训练营第六天|242. 有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
两个数组的交集,这道题并不需要交集的位置和次数之类的,只需要给出交集的数字就行了,所以简单粗暴的先用一个Set把前一个数组中所有元素去重放进去,在遍历第二个数组时,用前一个set判断下,包含的元素放入结果集的Set中,最后将结果集Set输出就好了。先预设一个长度26长度的int数组,每一个下标代表a~z的字符位置,通过遍历前一个字符串中每一个字符,将对应下标计数+1,之后再遍历后一个字符串,将每一个字符对应下标数值-1,最后查看int数组中是否有不为0的数即可。今天是第六天,开始学习哈希。
2024-11-18 10:32:30
346
原创 算法训练营第四天|24.两两交换链表中的节点、19.删除链表中的倒数第N个节点、面试题0207链表相交、142.环形链表II
这一题以前看过别的思路,如果只是判断链表是否有环的话,应该用一个快指针,一个慢指针,两个指针有重合就表示有环,但是这一题需要返回入环的节点,用快慢指针要涉及到计算入环节点,这里我用了个偷懒的办法,遍历链表,将元素都存入Set集合,每次存之前判断下是否已经存过,有即表示回到环的入口了,返回这个节点就行。总结:链表的操作乍一看挺简单的,就是一个节点里有value有next指针,但是真操作起来,对于移动的位置,是否需要虚拟头结点,各种交换,还是挺麻烦的,需要很仔细,并且要理清指针移动的底层逻辑。
2024-11-16 20:35:51
297
原创 算法训练营第三天 | 链表理论基础、203. 移除链表元素、707. 设计链表、206. 反转链表
这里其实我的基础比较差,对于设计一个链表一开始是懵圈的,主要是MyLinkedList类下需要有个默认的ListNode内部类,再有一个长度的定义,最后才是我们需要实现的各种方法,理清这个其实对应每个方法并不难,就是需要动手。反转链表我个人认为是比较简单的,因为逻辑上我认为其实就是遍历原链表时用头插法将元素指针重新调整下,但是代码真写起来总是容易错,这里记录下各种指针next来回改的情况,好记性不如烂笔头。今天开始链表这一章节,链表的理论基础包括链表的结构,内存存储结构,链表的常用操作。
2024-11-15 14:34:25
201
原创 算法训练营第二天 | 209.长度最小的子数组、59.螺旋矩阵II
这一题上来我是非常懵逼的,本来的想法是,建好一个n*n的二维数组,然后推导出一个数学公式,从1遍历到n*n时一个一个的往二维数组对应位置放相应的数就行了,结果推导了半天,依旧是懵逼状态,搞不定公式。2.在这个题目里,我们先用一个for循环来遍历,往后逐渐累加元素的和,找到大于等于目标值的位置后,先停下来,这时候的位置其实就是窗口的结束位置了,记为j;4.外层的for循环继续往后,j的位置逐渐增加,这里有个注意点是起始位置不需要从0开始了,就从上一轮的起始位置开始就行。如果不存在符合条件的子数组,返回。
2024-11-15 11:01:38
607
原创 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素、977.有序数组的平方
这个方法我看了很长时间,原来是仅仅用慢指针来标记新数组的长度,通过前面的快指针和target做判断,只要快指针对应下标的数组值不等于目标值,就移动慢指针一次,如果快指针下标对应的值是目标值,那慢指针就停下来,等快指针寻找到下一个非目标值的元素,此时慢指针再继续移动,太绝了!如果是左闭右开的区间,while条件里,left 就不能包括=right,因为left=right没有实际意义,此时while条件应该是while(left < right),这里的right = nums.length;
2024-11-13 21:42:21
501
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人