- 博客(29)
- 收藏
- 关注
原创 代码随想录训练营day34|贪心算法3| 1005.K次取反后最大化的数组和|134加油站|135分发糖果
1005.K次取反后最大化的数组和先对数组进行排序,然后对所有负数进行取反并计算总和,如果此时k已经用完,那么直接返回total,如果没用完,再对数组进行排序,找出此时的最小值,如果k为偶数,则返回total,如果为奇数则返回total-2*nums[i]134.加油站一共有三种情况:1. 如果汽油的总和小于消耗的总和,那么一定不能完成所以返回-1;2. 因为我们在求情况1时是从0开始的,所以如果在这种情况下能够完成,我们返回0。
2023-10-13 14:53:28 191
原创 代码随想录训练营day32|贪心算法|122. 买卖股票的最佳时机 II|55.跳跃游戏|45跳跃游戏||
利用count来记录当前跳跃次数,maxDis为最大可以覆盖的区域,curDIs为目前最大可以覆盖的区域。当i到达当前可以覆盖的最大区域时,更新当前可达最大区域至最大可达区域,然后增加count。这题需要注意的是i的取值范围是coverRange。
2023-10-12 15:12:57 166
原创 代码随想录day31|贪心算法|Leetcode 455 分配饼干|376. 摆动序列|53. 最大子序和
将两个数组排序之后,通过两个指针依次移动来判断当前饼干是否能满足当前孩子的需求。
2023-10-09 04:47:23 162
原创 代码随想录day29|491.递增子序列 |46.全排列 |47.全排列 II
通过uesd数组来进行判断前一个用过还是没用过,然后再通过used[i-1]来判断同一树层的数据是否使用过。
2023-10-08 07:30:49 78
原创 代码随想录训练营day28|LeetCode 93 恢复IP地址|78 80子集1|2
知识点:如果需要在字符串中增加或者删除字符,我们可以通过拼接字符串的方式:但是需要注意的是这种做法是非常昂贵的(时间复杂度较高),我们需要慎重考虑。我们也可以使用StringBuilder等方式来进行为了让代码看起来更简洁我们增加了一个判断是否成立的函数。
2023-09-21 00:12:44 52
原创 代码随想录训练营day27|LeetCode39 数组组合|40|131
这里最重要的就是去重。我们发现当i>index 时,证明我们已经遍历完了所有以index为开始的所有结果,在这个时候我们取的第一位是i;如果这个时候位于i位置的数和位于i-1的数相同,那么就会出现重复的情况(所有可能出现的结果都已经在i-1的时候考虑到了)所以在这种情况下我们需要去重。
2023-09-20 05:25:50 42
原创 代码随想录训练营day25|LeetCode 17电话号码的字母组成
这题的难点主要是在于怎么把数字和字母联系起来,我们可以利用一个数组,然后在对应的角标可以储存对应的字母。
2023-09-17 23:55:58 47
原创 代码随想录训练营day24|LeetCode77 组合|216 组合3
和组合基本没有区别,需要注意当path中元素个数等于k时,我们需要判定和是否为n。如果取完当前值之后,取完后面所有的值都没有办法凑齐k个元素,则直接不进行判断。
2023-09-17 22:47:54 44
原创 代码随想录训练营day23|LeetCode 669修剪二叉树|108|528
如果当前节点的值小于最小值,那么返回当前节点的右节点,反之返回左节点。
2023-09-17 03:27:29 100 1
原创 代码随想录训练营|LeetCode 235|701|450
简单来说在找到所需要删除的二叉树之后,如果左节点为空,那么返回右节点,如果右节点为空返回左节点,如果都不为空,那么将它的左节点放到右节点的最左节点上,然后再返回右节点。如果root值比两个都大,证明公共节点在左边,如果都小证明在右边,如果正好在中间,则他就是最近公共祖先。需要注意在每次递归时向上返回当前节点,上一层用root.left 和root.right 接住。最后递归时记得用root.left 和root.right 来接住递归的返回值。
2023-09-14 08:03:53 88 1
原创 代码随想录训练营day21|LeetCode 530
根据二叉搜索树的性质,中序遍历之后每个数都会按从小到大的顺序排列,绝对最小差一定是这个数组中相邻两个数的差值。所以我们通过min记录最小值,node记录前一个节点,每次都作差进行比较就能获得最小差。
2023-09-12 03:55:55 58 1
原创 代码随想录训练营day20|LeetCode 654|617|700|98
题目比较绕:每次递归都需要先找到最大的数,这个数左边的数放在节点左边,这个数右边的数放在节点右边。
2023-09-12 02:22:40 153 1
原创 代码随想录训练营day18|LeetCode 513
递归:我们需要先确定递归的终止条件:当左右都没有节点时我们需要判断当前节点的深度,如果深度大于最大深度,那么我们更新结果和最大深度的值。因为我们是从左侧开始递归的,所以我们第一个大于最大深度值,一定是这个深度下,最左侧的节点,对于后面的同一深度的情况,我们都不考虑。
2023-09-11 23:08:24 49
原创 代码随想录训练营day16|LeetCode 101|100|572|599|222
我们需要注意的是在比较二叉树的过程中可能出现的几种情况:左右子树一个为空另一个不为空,这种情况下一定不对称,两个都为空则对称,两个的值不相等一定不对称对于递归来说,我们需要注意的是每次比较的子树是左子树的左孩子和右子树的右孩子,和左子树的右孩子和右子树的左孩子。对于迭代来说我们需要注意放入元素的顺序,左子树的左孩子对应右子树的右孩子,左子树的右孩子对应右子树的左孩子。
2023-09-09 04:28:10 221 1
原创 代码随想录训练营day15|LeetCode 102|199|637|429|515|116|117|104|111|226
层序遍历一般有两种方法:迭代和递归。对于递归来说:我们需要在每一次递归时传递深度,这样我们才能够知道这个节点应该被放在哪一层的集合当中。当我们发现结果的层数少于深度时,我们需要增加一个新的数组进入结果中。然后通过deep的值来将该节点放入对应的集合中。对于迭代来说,我们利用了队列来解决。因为队列先进先出,所以我们可以先弹出已经进入的节点,然后把节点的左右子节点放入队列中,并储存结果,直至这一层节点都遍历结束。我们需要在最开始获取当前队列的长度len。每增加弹出一次节点就将len--;
2023-09-07 02:47:55 89 1
原创 代码随想录训练营day14|前中后序遍历|迭代|递归
前中后序遍历的区别主要在于在什么时候需要在答案中加入root的值:前序遍历在递归历前,中序遍历在递归中,后序遍历在递归之后。
2023-09-06 07:59:39 43 1
原创 代码随想录训练营 day13|LeetCode239|LeetCode347
这里我们使用双端队列来辅助我们完成滑动窗口的移动,我们用这个双端队列来储存。这样我们能够清除的知道这个位置是否处于滑动窗口当中。在循环的过程中,我们往双端队列中增加数据时,我们需要首先判断目前的最大值是否在滑动窗口的范围中,如果不在我们需要从双端队列的尾部移除该元素。然后我们需要判断这个值和双端队列首部的元素依次比较大小,如果前面的数比该数要小,则从双端队列首部移除元素,直至双端队列中没有元素或者前面的元素要大于该增加元素。从首部增加元素,最后把双端队列中的结果储存到结果中。
2023-09-06 03:41:47 66 1
原创 代码随想录训练营day11|LeetCode 20|LeetCode 1047|leetCode 150
我们可以发现不满足有效括号的情况只有三种:任意左括号多了,括号不匹配,任意右括号多了。所以我们可以利用栈先进后出的特性:当我们遇到任意左括号时将其对应的右括号放入栈中,当我们遇到右括号时,比较和栈顶元素是否相同,不相同则不匹配。
2023-09-04 23:10:30 75 1
原创 代码随想录训练营day10|LeetCode 232|
用两个栈来实现队列。当需要pop时,将StackIn栈中的值一次弹入out栈中,再进行pop。
2023-09-04 01:26:16 41 1
原创 代码随想录算法训练营day09|LeetCode 28|LeetCode 459 KMP算法
这里使用了KMP算法的相关知识,KMP算法中最重要的是对于Next数组的使用对于KMP算法来说,我们在对于两个字符串进行比较时,如果我们发现当前字符不匹配,那么我们可以通过寻找到当前字符串位置为止的字符串的最长相等的前缀和后缀。而Next数组就是为了保存这些位置的最长相等的前缀和后缀的位置。当我们在i位置发现字符串不匹配时,我们可以直接返回next[i-1]的值,从而从next[i-1]位置继续开始进行匹配。
2023-09-04 00:23:05 83 1
原创 代码随想录day08|LeetCode 344|
这题的方式比较巧妙,我们可以先翻转前一个部分的字符串,再翻转后一部分的字符串,最后再翻转整个字符串,这样我们就能够获得所需要的字符串了。去除首尾以及中间多余的空格;翻转整个字符串,反转各个单词。
2023-09-01 18:11:43 29 1
原创 代码随想录day07|Leetcode 454四数相加|15 三数之和|18四数之和
如果i为第一个-1,left为第二个-1,right为最后一个2,这种情况满足a+b+c=0;我们需要对整个数组先进行一个排序,这样对于每一个i的值,我们可以根据abc和的不同来更改left和right的大小。这题主要复杂的地方在于去重,因为题目要求结果不能重复:即便一个数组为{-1,-1,-1,-1,-1,2,2}我们的结果也只有一个{-1,-1,2}虽然我们可以取到不同的-1;当a为第一个-1时,left和right的取值区间为{-1,0,1,2,3,4}如果a+b+c
2023-08-31 02:00:52 48
原创 代码随想录day06|哈希表|Leetcode 242|383|49|438|349|350|202|1
通过一个长度为26位的数组来统计每个字母出现的个数。这里的一个技巧是我们并不需要统计两个String 类型字母的个数,我们可以通过相减的方式,如果出现次数都是相同的,那么最后这个数组的所有位置都应该为0。
2023-08-30 04:55:54 143 1
原创 代码随想录训练营day04|LeetCode 24 两两交换链表中的结点|:LeetCode 19 删除倒数第n个结点
链表相关的问题就告一段落了,在解决链表问题的过程中我们也使用了快慢指针的思想。比如在删除倒数第n个结点的问题中:我们先让快指针移动n个节点的距离,然后再同时移动,这样我们就能保证在快指针抵达最后一个位置的时候,慢指针的位置一定是需要删除结点的前一个位置,这样我们就能够进行删除操作了。环形链表问题中:我们先通过如果有环那么移速不同的两个指针一定会相遇来判断链表是否有环。再根据数学分析确定,如果此时有两个指针一个从头结点出发,一个从当前结点出发,这两个结点相遇的位置一定是环的起始位置来寻找环的起点。
2023-08-26 19:42:34 81
原创 代码随想录训练营day03|链表|LeetCode 203 删除链表元素|707 设计链表|206 反转链表| 76 最小覆盖子串
一般我们需要设置dummyNode哨兵结点来确定我们是否需要删除第一个结点。
2023-08-25 22:53:32 255 1
原创 代码随想录训练营第二天|35 搜索插入位置|34|69|26|283|904
利用两次二分分别查找start和end,start和end初始化为-1,在每次遇到target值时:1. 对于start,将right改为mid-1继续二分直至left>right2. 对于end,将left改为mid+1继续二分直至left>rightint left=0;return res;
2023-08-24 22:57:41 343 1
原创 代码随想录算法训练营第一天 | LeetCode704 二分查找 | 27 移除元素 | 977 有序数组的平方 | 209 长度最小的子数组 | 59 螺旋矩阵
数组中常用的二分法,滑动窗口,二分法leetcode
2023-08-22 23:10:56 548 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人