- 博客(12)
- 收藏
- 关注
原创 代码随想录算法训练营第14天|226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度
和最大深度的区别是如果一个节点的左右子树都为空,那么它就不能算作深度,所以就要做出判断,如果左子树为空但右子树不为空,就是右子树的高度加1,反之亦然。如果都不为空,就是两者最小值加1。定义一个getdepth函数,递归,终止条件是node为空,返回0,最终返回左子树深度和右子树深度的最大值,代码如下。先同时遍历左右节点的外部,判断是否相同,再遍历内部,如果两者都相同,则可以返回TRUE。用递归的方法,先进行左右交换,再调用这个函数,先遍历左节点,再遍历右节点。
2025-02-27 12:38:24
275
原创 代码随想录算法训练营第14天|递归遍历,层序遍历
遍历有三种形式,分别是前中后序,意思就是中在哪里,然后放左右。dfs(node.left)意味着一直遍历左边,直到None然后返回上个Node,继续,代码如下(前)中和后改变append位置即可。都是根据层序遍历从而变形得到代码。
2025-02-25 17:50:03
257
原创 代码随想录算法训练营第11天| 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个高频元素
【代码】代码随想录算法训练营第11天| 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个高频元素。
2025-02-23 20:36:27
246
原创 代码随想路算录算法训练营第十天|232.用栈实现队列,225. 用队列实现栈 , 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项
思路1因为栈是先进后出,比如1.2.3进去,先出来的是3,但是队列的话先出来的是1,这就要求再设置一个栈,用来反转顺序,代码如下225. 用队列实现栈 思路栈是先进先出,但同时有设置好的模块,即append为尾进,popleft为头出,但是pop就为尾出,即相当于栈的pop,代码如下 20. 有效的括号思路先遍历所有的括号,出现({[就对应的另一个括号放进去,这样的目的是当判断下一个值是否目前的括号配对,配对了就从栈移除,代码如下。1047. 删除字符串中的所有相邻重复
2025-02-22 15:13:49
340
原创 代码随想录算法训练营第八天| 344.反转字符串 , 541. 反转字符串II,54.替换数字
遍历的时候依次遍历2k个即可,因为字符串不能原地修改,所以先将字符串转化为列表。在覆盖列表,代码如下。直接遍历字符串,如果有数字,替换,没有就加进去,代码如下。设置两个指针,分别交换位置即可,简单的。541. 反转字符串II。
2025-02-19 12:54:23
204
原创 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
注意:要去重,先去固定点,如果固定点的值和前一个一样,那么说明后面再怎么移动至少都能得到相同的结果。和前一天的有效字母异位词一样,先记录ransomNote中每个字母的数量,再减去magazine中对应的字母数,之后遍历,如果有一个值大于0,就返回false,否则返回true。用双指针的方法,首先将数组排序,先固定一个起点,然后设置左指针和右指针,相加,如果等于0,因为已经排好序了,所以单独移动哪个都不行,即同时移动左右指针。比三数之和多了一个遍历,即一开始固定两个值,再设置左右指针,代码如下。
2025-02-18 20:15:04
224
原创 代码随想录算法训练营第五天| 242.有效的字母异位词,349.两个数字的交集 ,202.快乐数,1.两数之和
242.有效的字母异位词思路利用哈希表,计算s中每个字母出现的次数,继续根据t减去相同的字母,最后如果哈希表的值全为0,说明是异位词。代码如下349.两个数字的交集思路用集合,挺简单的。
2025-02-17 16:45:36
267
原创 代码随想录算法训练营第四天|24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交, 142.环形链表II
对于何时进入环看这张图,快指针走了x+n(y+z)+y,慢指针走了x+y,同时快指针速度为2,慢指针速度为1,则(x+y) =[x+y+n(y+z)]/2,化简得x=(n-1)(y+z)+z,所以可以设置两个指针,一个在相遇点,一个在起点,两者同时运动,最后一定在开始进入圈的点相遇。但是更好的做法是设置快慢指针,让快慢指针相差n个,当快指针运动到最后的时候,就可以根据慢指针的位置删除所要的元素。首先算出每个链表的长度,将长链表的指针移到与短链表相同,之后同时移动两个指针,如果指针相同,则是相交点。
2025-02-15 21:14:51
381
原创 代码随想录算法训练营第三天| 203.移除链表元素 , 707.设计链表, 206.反转链表
这里用到了设置虚拟节点,因为头节点删除和其他节点不一样。将虚拟节点赋值给cur,循环结束条件为cur.next不存在了,即cur遍历到最后了。当中如果找到val了,那么让cur指向后一个节点即可。最后返回虚拟节点下一个。设置两个节点,第一个节点负责移动,同时第一个节点指向第二个节点即可完成反转,最后return 第二个节点就行,因为到最后第二个节点就是头节点。同时循环的终止条件为第一个节点为空,代码如下。主要就是先定义一个ListNode,利用虚拟头节点进行操作,要注意的是对于index要注意范围。
2025-02-14 20:21:18
332
原创 代码随想录算法训练营第二天 |209.长度最小的子数组, 59.螺旋矩阵II,区间和,开发商购买土地
思路滑动窗口:就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果设置一个指针表示序列的终止位置,不断移动,直到首项到终点的数字和sum大于等于target。这时候再不断移动初始点,具体做法是将sum减去初始点的值,看是否大于traget,若大于,说明可继续右移初始点(左指针右移),指针之间的数量为右指针减去左指针加1。代码如下还有一种暴力解法就是循环两次,第一个循环代表从第一位置开始依次遍历完整个数组,接下来从第二个位置开始遍历完整个数组。
2025-02-13 18:45:37
433
原创 代码随想录算法训练营第一天 |704、二分查找 27、移除元素 977 有序数组的平方
第二次虽然也是暴力解法,但是考虑了数组长度限制,即每次循环结束会将长度减一,并且是覆盖进行的,即如果数组中出现了要删除的元素,那么就将接下来每一个元素往前移,覆盖掉要删除的元素,同时指针往前退,以便下一次检查的是新覆盖的元素。接下来就是用双指针法,设置两个指针,一个快的,一个慢的,快的依次查找数组元素,如果不等于要删除元素,慢指针的元素就等于快指针,同时将慢指针往前移,如果快指针所在位置等于要删除元素,慢指针原地不动。注意:1、二分法前提是有顺序排列 2、左闭右闭和左闭右开的循环条件是不一样的。
2025-02-12 13:29:15
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅