代码随想录
文章平均质量分 55
evil_overall
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营|五十九~六十天
单调栈,也和每日温度一样三种情况,如果数组[i]的元素和栈头相同,得先弹出栈内元素再压入,因为最后求最高值是相同元素取最右边的元素,左边用不到;如果大于,取栈头做mid,然后取左右两遍的最小值做高,宽度是i-栈头(不是mid,mid已经弹出)-1,最后相乘就是容积。双指针法,例如i=4,然后从i开始向左右遍历直到找到左右的最高点,再找到左右的最小值减去i的高得到多少个容纳单位。这题主要得注意数组前后都要加上0,如果没加上0,数组元素循环到栈内会一直跳过情况三,具体看代码随想录。原创 2023-11-21 21:09:29 · 539 阅读 · 0 评论 -
代码随想录算法训练营|五十七天
压入栈时的元素和栈内的元素比较,有三个情况,栈内元素大于等于压入栈时的元素,此时压入栈内;如果小于压入栈内的元素,先记录result,再在栈中弹出元素,一直循环,直到大于等于压入栈时的元素,才压入栈内。原创 2023-11-20 20:19:11 · 97 阅读 · 0 评论 -
代码随想录算法训练营|五十五天
因为两个字符串都能删除,所以字符不匹配的话就有三个方向取最小值赋值给dp[i,j],不过这里dp[i-1,j-1]+2=dp[i,j-1]+1,从字面上理解 就是 当 同时删word1[i - 1]和word2[j - 1],dp[i][j-1] 本来就不考虑 word2[j - 1]了,那么我在删 word1[i - 1],是不是就达到两个元素都删除的效果,即 dp[i][j-1] + 1。(抄的,还是没搞懂,只能不省略三个方向一起写)word1增加d的操作数和word2删除d的操作数是一样的。原创 2023-11-16 16:24:53 · 68 阅读 · 0 评论 -
代码随想录算法训练营|五十四天
这里递推公式中,有相等和不相等两种情况,相等字符是dp[i,j] = dp[i-1,j-1]+dp[i-1,j],例如下图的s和t字符串,循环到最后一个c时,dp[i-1,j-1]是首次遇到的次数,dp[i-1,j]是在此的循环之前所累计的次数,两个相加就是循环到最后一个c时所有的累计结果。如果不相等,就不需要考虑dp[i-1,j-1]原创 2023-11-16 10:38:21 · 59 阅读 · 0 评论 -
代码随想录算法训练营|五十三天
这题的递推,和最长重复子数组差不多,只是那题是相同长度,所以递推可以往斜推,这题两字符串长度不一样,碰到不同字符要i-1或者j-1的方向走。和贪心差不多,先加,再比较大小。最大子序和(动态规划)原创 2023-11-14 16:27:00 · 53 阅读 · 0 评论 -
代码随想录算法训练营|五十一天
有点像双指针的操作,例如{2,5,6,4,3}(写不出来,画图)这个图就很清楚递推怎么来的。数组不连续递增就重新计数。原创 2023-11-13 21:07:19 · 146 阅读 · 0 评论 -
代码随想录算法训练营|第五十天
买卖股票的最佳时机含冷冻期。买卖股票的最佳时机含手续费。原创 2023-11-11 10:56:41 · 75 阅读 · 0 评论 -
代码随想录算法训练营|四十五天~四十九天
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);买卖股票的最佳时机||(动态规划)原创 2023-11-11 09:50:58 · 78 阅读 · 0 评论 -
代码随想录算法训练营三十四~三十六天|贪心
否则,刷新气球2的终点(气球1和气球2的终点取最小,此时气球1和气球2的重叠部分成[2,6],取6),要点:把整个字符串遍历,并且收集好每个字符最后出现的下标值,然后就是根据收集的hash去遍历字符串,遍历过程中只要i==字符最后出现的下标值,就记录到result。要点:和引爆气球相同的思路,只要intervals[i][0]>=end(第二个区间的下标0比第一个区间的下标1大,说明不重叠),result++,最后结果数组长度减去result。难点的地方在代码实现,具体看备注。用最少数量的箭引爆气球。原创 2023-11-03 17:05:04 · 77 阅读 · 0 评论 -
代码随想录算法训练营三十一~三十三天|贪心
要点:按题目要求,设起点在0,然后循环数组,记录gas[i]-cost[i]的差值,如果消耗比加油大(也就是gas-cost<0),就起点+1,清空累加值,最后把所有结果累加进目标累加值,如果小于0,返回-1,大于返回起点的标志位。要点:先按照绝对值的大小从小到大排序,然后for循环从最后往前循环,只要有取反,就k--,直到k=0,或者数组循环完成,k还大于0,此时直接取反数组第0位,最后求和。要点:就一个一个去算它能走的最大步数,如果比之前的index还大就更新index,小就不更新;原创 2023-10-30 23:14:48 · 40 阅读 · 0 评论 -
代码随想录算法训练营第二十五~二十八天|组合问题、分割、子集、排列
used[nums[i]+100] == 1,验证之前收集的元素是否存在。其他的和子集||相似,只有递归逻辑不同,题目说了可以重复,但是只能由前向后,不能后面的元素找到前面一样的元素,然后就是记录方式,可以字典或者直接数组记录,题目已经提供的范围在[-100,100]之间,所以创建新二维数组201。要点:这里的全排列,是把所有的排列组合收集,例如{1,2,3},结果是[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],但是要求集合里的元素不重复。原创 2023-10-25 21:37:15 · 41 阅读 · 0 评论 -
代码随想录算法训练营第二十三天
参数和输出:一般只要参数,不用输出;停止条件,:也是if语句,里面写存放结果和return;解决的问题:组合、切割、子集、排列、棋盘。回溯法解决的问题都能抽象为树形结构。一种回溯搜索法,属于纯暴力搜索。原创 2023-10-17 21:00:42 · 69 阅读 · 0 评论 -
代码随想录算法训练营第二十天~二十二天
将有序数组转换成二叉搜索树。二叉搜索树的最近公共祖先。把二叉搜索树转换成累加树。二叉搜索树的最小绝对值。二叉树的最近公共祖先。二叉搜索树的插入操作。删除二叉搜索树的节点。原创 2023-10-16 17:46:30 · 38 阅读 · 0 评论 -
代码随想录算法训练营第十九天
思路:按题目要求,单层逻辑是先取数组最大值做节点,然后最大值的左边就是左字树,右边就是右子树。如果left>right,则表示叶子节点。原创 2023-10-12 15:46:45 · 43 阅读 · 0 评论 -
代码随想录算法训练营第十八天
递归:参数:root,初始深度,目标值,目标值所在的深度;逻辑:左右节点不空,则进去循环,注意depth要加1,以完成回溯(depth+1等效于在函数外depth++,退出函数后depth--,详见程序)。第四步,切割中序数组,切成中序左数组和中序右数组,第五步,切割后序数组;思路:得先清楚题目要求的左下角的值不是特值左节点的值,而是在那一层中靠近左边的节点,也就是说左右节点都可能是左下角的值。(路径总和||)主要是递归函数不用返回值,还有递归节点后,不止要返回到父节点,还要把list压入的元素弹出。原创 2023-10-11 17:37:36 · 35 阅读 · 0 评论 -
代码随想录算法训练营第十六天
思路:参数:root;停止条件:左节点为空,或者左节点的左右孩子为空;逻辑:按照后序遍历的思路,先处理左边的左叶子,要注意如果左叶子成立(左节点的左右孩子为空,则为左叶子),取得数值后再处理右边的左叶子,左右相加返回。的左右两个子树的高度差的绝对值不超过 1),如果节点为null,则平衡;如果节点的左右孩子相差高度的绝对值大于1,就是不平衡,小于等于1,返回高度值。有时间再重新理清一遍,现在还不能完全理解。思路:按照题中的定义(原创 2023-10-10 17:12:43 · 37 阅读 · 0 评论 -
代码随想录算法训练营第十五天
递归:主要要判断当前节点的左右结点为null的情况,左空右不空就要rightdepth加1,右空左不空就leftright加1,直到root为null才返回左右节点的深度。思路:递归:参数是root,终止条件是root为null,逻辑就是左边递归到null,然后右边也递归到null,最后比较哪个大,再加中间值(1)返回。思路:迭代:和找最大深度一个思路,不停循环,不过停止条件是如果左右结点为null,则要直接退出循环返回最小值。思路:迭代:照模版套,然后得加个记录节点的int就行了。完全二叉树的节点个数。原创 2023-10-09 15:04:48 · 33 阅读 · 0 评论 -
代码随想录算法训练营第十四天
思路:主要利用到队列,先得到每层结点的元素个数,此时队列内的元素为同一层的全部结点,然后访问这些结点,并将这些结点的非空子结点入队列。一轮访问结束之后,当前层的全部结点都已经出队列并被访问,此时队列内的元素为下一层的全部结点,下一轮访问时即可访问下一层的全部结点。如果左右结点不为空,则左树的左结点和右树的右结点&&左树的右结点和右树的左结点&&左树的中结点和右树的中结点比较得出true或者false。按题目要求只要输入输出二叉树,终止条件为二叉树为null,逻辑就是按前序递归,左右交换结点,然后递归。原创 2023-10-07 20:28:53 · 46 阅读 · 0 评论 -
代码随想录算法训练营第十三天
在二叉树中,可以通过遍历算法来按照一定的顺序访问树中的节点,常见的遍历方法有前序遍历、中序遍历和后序遍历。二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的遍历方式:深度优先遍历(先往深走,遇到叶子节点再往回走)、广度优先遍历(一层一层的去遍历)2.二叉树的递归遍历(前序(中左右)、中序(左中右)、后序(左右中))3. 左子树和右子树也是二叉树,它们分别是原二叉树的左子树和右子树。二叉树的种类:满二叉树、完全二叉树、二叉树搜索、平衡二叉树搜索。原创 2023-10-05 19:46:48 · 32 阅读 · 0 评论 -
代码随想录算法训练营第十二天
思路:用字典收集数组中的元素,之后创建优先级队列(默认小顶堆),小顶堆会优先把value较小的值排在队列末尾,如果队列Count等于k+1,就移除队列末尾,直到循环结束,结束后再输出给list排列返回toarray。思路:先写类MyQueue,函数Enqueue,实现当压入值比队列中最后一个元素大时,就移除队列末尾元素,直到队列没有元素或者队列末尾元素大于压入值跳出,并把压入值加入到队列末尾;函数Dequeue,功能是当队列中的Count已经到K值,则移除队列中的第一个元素,使压入值能加入到队列末尾;原创 2023-10-04 17:34:59 · 41 阅读 · 0 评论 -
代码随想录算法训练营第七天
思路:不用考虑太多,主要在第一轮for循环中start+=(2*k),有这一步直接解决题目提出的要求。151.反转字符串中的单词。541.反转字符串 ||LCR122.路径加密。LCR128.动态口令。原创 2023-09-27 20:00:00 · 41 阅读 · 0 评论 -
代码随想录算法训练营|454.四数相加||、383.赎金信、15.三数之和、18.四数之和
最后得注意去重,一个是判断i是否和前面的i-1指向的元素相同,相同进入新一轮循环;思路:四个数组分成两大组独立循环,遍历nums1+nums2的所有元素和并且加入到字典中,再遍历nums3+nums4,一个个去和字典存在的值比较(注意比较需要取负数)。总结:今天这几道题挺好写的,看文本解析大概知道要怎么写,麻烦点的就三数之和,考虑的东西有点难想到,多加练习就明白题目的套路,其他方面没有太大的问题。思路:和三数之和一样套路,就是要多一个循环,还有题目提供目标值,不需要去判断数组大于0的情况。原创 2023-09-26 15:36:35 · 84 阅读 · 0 评论 -
代码随想录算法训练营|242.有效的字母异位、349. 两个数组的交集、202. 快乐数、1. 两数之和
总结:今天关于哈希表的题,其实都没用到,全都用C#的字典,主要是我对字典熟悉,加上字典好像是哈希表衍生出来的数据类型。思路:数组循环存储在字典中,判断字典的中是否存在target-nums[i](之前没想到方法能直接放target-nums[i]的式子),减去的结果字典有就返回新数组;对于一个数进行一次操作,可以将数转换成字符串之后遍历字符串的每一位计算平方和,也可以直接对给定的数做数位分离计算每一位的平方和,这里使用的是数位分离的做法。当出现循环时,如果 n=1 则返回 true,否则返回 false。原创 2023-09-25 16:19:46 · 80 阅读 · 0 评论 -
代码随想录算法训练营第四天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07. 链表相交、142.环形链表II
思路:双指针法,分别在指向两个链表的头结点,然后一直循环,有指针到null就指向另一个链表,直到两个指针指向元素相同或者同时指向null,跳出循环,输出其中一个指针。怎么找到入口,也是靠双指针,一个指向原来快慢指针的指向元素,另一个从起点开始,之后一直循环直到两指针相同。思路:利用双指针解决,因为是删除倒数的第N个节点,然后相当于快指针指向null,慢指针指向目标节点,快慢指针相差N。可以先让快指针指向head之后的n个节点,再同时移动快慢指针就能使慢指针指向目标节点。24. 两两交换链表中的节点。原创 2023-09-23 21:02:21 · 232 阅读 · 0 评论 -
代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
思路:先写在链表中插入元素,也就是在目标节点之前加入,其实就是打断原有的指向,把指向切到temp就可以了,不过要注意temp要先指向head,再dummyhead指向temp,相反的话会丢失head元素。接下来判断temp.next.val == val,是则跳过temp.next所指的元素,指向temp.next.next的元素;3、循环结束,最后要记得返回dummyhead.next,因为dummyhead是在原链表删除元素后的结果,temp只是指向链表中的元素。203.移除链表元素。原创 2023-09-22 19:39:28 · 368 阅读 · 0 评论 -
代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
思路:双指针的方法,快指针循环直到sum>=target,再对快慢指针包括的数组的长度比较,比较后减去慢指针i所属的元素,再i++。结束一遍循环后再判断sum是否大于等于target,是就继续减去慢指针,再i++,否则再for循环一遍,快指针往后移动,直到sum>=target或者到达数组的长度。总结:前两道题看一下视频知道是用双指针后很容易就解决,不过这第三道螺旋矩阵看视频一时间没想起来,后面多画几张图之后才明白是怎样的一个思路。问题:现在能跑正方体的矩阵,但是长方体的矩阵还没跑出来。原创 2023-09-21 15:29:22 · 514 阅读 · 0 评论 -
代码随想录算法训练营第一天| 704.二分查找、27.移除元素、34、35。
在while循环直到left原创 2023-09-20 16:31:31 · 667 阅读 · 0 评论