![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录学习笔记
文章平均质量分 79
根据每日学习情况更新,题目和顺序与代码随想录一致,增加了力扣可通过的超全注释的代码、解题的整体思路、算法的具体流程、容易产生bug的算法注意点和语法注意点。
守岁白驹hh
HQU
展开
-
代码随想录:动态规划11-15
有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。如果x == y,那么两块石头都会被完全粉碎;如果x!= y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回0。示例 1:1组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],原创 2024-08-20 11:42:03 · 249 阅读 · 0 评论 -
代码随想录:动态规划6-10
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?28。原创 2024-08-19 09:47:47 · 326 阅读 · 0 评论 -
代码随想录:动态规划1-5
(通常用F(n)表示)形成的序列称为。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n,请计算F(n)。原创 2024-08-18 10:29:03 · 289 阅读 · 0 评论 -
代码随想录:贪心22-23
当且仅当每个相邻位数上的数字x和y满足x <= y时,我们称这个整数是的。给定一个整数n,返回小于或等于n的最大数字,且数字呈。原创 2024-08-12 07:12:45 · 218 阅读 · 0 评论 -
代码随想录:贪心20
以数组intervals表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].原创 2024-08-10 11:42:56 · 107 阅读 · 0 评论 -
代码随想录:贪心19
给你一个字符串s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是s。返回一个表示每个字符串片段的长度的列表。[9,7,8]划分结果为 "ababcbaca"、"defegde"、"hijhklij"。每个字母最多出现在一个片段中。像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。原创 2024-08-10 11:17:06 · 211 阅读 · 0 评论 -
代码随想录:贪心18
找移除区间的最小个数,就是找最少的重复区间,就当删除区间的覆盖范围尽量大一些。如果i的左区间大于等于i-1的右区间,说明i-1和i不重叠,不用删。如果i的左区间小于i-1的右区间,说明重叠i-1和i重叠了,重叠区间个数count+1,同时,为了下一步继续判断i+1和上面的区间是否重叠,需要更新i的右区间为i-1和i右区间的最小值。原创 2024-08-10 10:18:21 · 191 阅读 · 0 评论 -
代码随想录:贪心17
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 ,其中 表示水平直径在 和 之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 处射出一支箭,若有一个气球的直径的开始和结束坐标为 ,, 且满足 ,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。给你一个数组 ,返回引爆所有气球所必须射出的 最小 弓箭数 。示例 1:输入:points = [[10,16],[2,8],[1原创 2024-08-10 09:25:18 · 281 阅读 · 0 评论 -
代码随想录:贪心14
两次贪心,第一次根据people的身高h进行降序,身高若相同再按照k升序排序。这样可以保证p前面的所有p的身高都大于等于p本身。然后就能根据p的k将其插入索引k,第二次遍历排序后的people,根据p[h][k]的k,将每一个p插入链表的索引p位置。最后,将链表转为数组返回。原创 2024-08-10 08:42:53 · 322 阅读 · 0 评论 -
代码随想录:贪心11-13
首先,我们核心要关注的是gas和cost的剩余量rest。用totalsum统计走完一圈的rest之和,如果为负数,说明无论从哪个位置开始,油都是不够的,返回-1。如果totalsum>=0,说明存在一个合适的起始位置,那么要如何找这个起始位置呢。我们要定义一个index表示起始位置,初始值为0,表示我们假设起始位置是0,再定义一个tmpsum,用于计算从index开始往后的的rest和,初始值为0。以rest=1 1 3 -6 1 为例。原创 2024-07-04 12:17:54 · 713 阅读 · 0 评论 -
代码随想录:贪心6-7
对于一个股票值12345,我们只用关注正收益值,而不用关注其对应的区间,把12345计算出对应的profit1111,只要收益是正的,就加入res。我们主要关注跳跃的覆盖范围能否到达数组最后,而不用关注是怎么跳跃过去的,而覆盖范围比如23114,遍历2,可以覆盖到0+2,cover=2,遍历3,可以覆盖到1+3,cover=4,到达数组最后,返回true。对于32104,遍历3,覆盖到0+3,cover=3,遍历2,覆盖到1+2,cover=3,遍历1,覆盖。原创 2024-07-02 21:13:24 · 442 阅读 · 0 评论 -
代码随想录:贪心2-4
两种逻辑,一种是控制胃口,从大到小分,一种是控制饼干,从小到大分。1、控制胃口,从大到小分用for控制胃口1357的原因是,从大到小,对每一个小孩找饼干246。如果有足够大饼干就他,没有的话这个小孩就被轮空不吃。小孩的胃口不管有没有满足,都需要找下一个小孩子了。比如第一个小孩胃口7,饼干6满足不了,他就被轮空吃不到,for循环i--,找下一个胃口小孩。但是饼干没有分出去还是指向6。2、控制饼干,从小到大分用for控制饼干1357的原因是,从小到大,对每一个饼干找小孩246。原创 2024-07-02 10:43:01 · 748 阅读 · 0 评论 -
代码随想录:贪心8-9
用cur记录当前走的步数最大覆盖的范围,用next记录下一步的最大覆盖范围,用count进行跳跃次数统计。如果next到了序列最后,说明在当前步数基础上,再走一步就到了最后了,count+1后,直接跳出for循环返回结果就行。如果next没到最后,说明还需要继续往后遍历i。如果i!=cur,说明当前count的覆盖范围下,i还能往后再看看,更新一下当前count对应的cur覆盖范围的最大next。原创 2024-07-03 12:10:44 · 678 阅读 · 0 评论 -
代码随想录:回溯20-21
树的每一层row代表棋盘的一行,里面的for循环代表棋盘的一列。row从0开始,当row到达n,说明走出棋盘了,作为叶子节点可以收集结果。如果某个位置设置为Q,加入棋盘后导致棋盘不合法(同行、同列、同斜线),就要剪枝,但是剪枝是需要知道当前位置的row和col,所以把剪枝写在for循环里面,只有当前位置合法,才修改成Q,然后递归下一行row+1。如果不合法,直接跳过当前col,进入for循环的下一层循环。判断位置是否合法,需要判断同列、同斜线,其中同斜线有两种情况,不要漏了。原创 2024-06-14 18:00:42 · 900 阅读 · 0 评论 -
代码随想录:回溯19
优先队列可以保证让我们找到字典序最小的路径。这道题用回溯操作嵌套的map,代码会很难写,而且容易超时,用深度优先+map+优先队列是最好理解的。以下图为例。首先,从JFK开始获取到它的优先队列pq={ATL,SFO},ATL是队首元素,说明ATL是JFK的字典序最近到达点,因此路径JFK-ATL。此时JFK的pq={SFO}然后,从ATL开始获取它的优先队列pq={JFK,SFO},JFK是队首元素,说明JFK是ATL的字典序最近到达点,因此路径JFK-ATL-JFK。此时ATL的pq={SFO}原创 2024-06-12 12:01:36 · 544 阅读 · 0 评论 -
代码随想录:回溯14-17
和子集类似,也要收集处理叶子节点之外的节点。和子集不同的是:①子集要收集所有中间节点,而这里是收集递增子序列,所以path长度到2才能开始收集,且当序列不递增的情况也不能收集,比如4767,path长度为1的第一层树高节点不用收集,path=47,继续收集67时,476不递增也不能收集。②子集的去重可以靠sort+前后元素比较进行去重,但由于这里找的是递增子序列,sort之后会破坏原来的序列,比如4767排序之后会收集出4677,这个应该是没有的。原创 2024-06-11 11:50:54 · 766 阅读 · 0 评论 -
代码随想录:回溯9-13
给你一个字符串s,请你将s分割成一些子串,使每个子串都是。返回s所有可能的分割方案。s = "aab"原创 2024-06-06 11:14:28 · 315 阅读 · 0 评论 -
代码随想录:回溯5-8
给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。原创 2024-06-05 11:02:23 · 387 阅读 · 0 评论 -
代码随想录:回溯算法2-4
其实就是用一个树来模拟我们手动进行组合数字的过程。(假设n=4,k=2)A.先考虑for循环,从[1-n]遍历,其实就是先选第一个数字1,path里面放了1,选完第一个数字add之后,执行backTracking(n,k,2),过程如下。①递归[2-n],i=2,选择第二个数字2,path里放了12。选完第二个数字之后,递归[3-n],这时因为path里有2个元素了,直接进入终止条件,把path12加入res然后直接return。原创 2024-06-04 11:19:27 · 357 阅读 · 0 评论 -
代码随想录:二叉树11-12
层序迭代和后序递归的核心逻辑很简单,就是用普通的遍历二叉树的方法,一边遍历一边计算节点数,即在原先的遍历代码中加上计算节点数的代码即可。时间复杂度是o(n)。满二叉树递归的核心逻辑,利用了满二叉树的性质,如果一个子树的满二叉树,从根节点往左和往右的最大深度是一样的。因此我们通过前序递归遍历二叉树,如果当前节点时满二叉树(终止条件),就可以直接计算节点数是2^depth-1,不用继续遍历其孩子节点。如果不是满二叉树(单层逻辑),就继续前序遍历下去,不是满二叉树的节点数=左子树节点+右子树节点+1。原创 2024-04-19 22:35:29 · 1150 阅读 · 0 评论 -
代码随想录:哈希表相关题目推荐(49、438、350)
给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。是由重新排列源单词的所有字母得到的一个新单词。strs =原创 2024-05-21 12:37:25 · 292 阅读 · 0 评论 -
代码随想录:螺旋矩阵II相关题目推荐(54、LCR146)
给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。n = 3。原创 2024-05-14 10:29:51 · 427 阅读 · 0 评论 -
代码随想录:长度最小的子数组相关题目推荐(904、76)
题目看着很绕,其实就要找一个最大的连续数组(数字种类小于等于2)而已。查找方法就是用滑动窗口,left和right固定。然后,right遍历水果数组,把right种类put到哈希表中(key是水果种类,value是出现次数)。map存储的是当前left和right窗口中的水果种类和对应的数量。如果map的大小>2,即水果种类大于2,就要缩小窗口,修改map,map中key为left的value减1。如果value为0,直接把left从map中remove。然后,left右移,直到size小于2。原创 2024-05-13 12:14:00 · 572 阅读 · 0 评论 -
代码随想录:移除元素相关题目推荐(26、283、844)
核心是快慢指针,快指针进行遍历,指向带判断的元素,slow指向前一个被插入的元素,用于和fast进行比较。如果相同,fast往后走,如果不同,把fast插入slow+1位置,slow后移,fast后移。核心还是fast和slow指针。fast指向带判断的元素,对nums进行遍历,slow指向待插入元素的位置。如果fast是0,fast++后移继续判断。如果fast不是0,就把fast插入slow,然后slow后移指向新的待插入元素位置,fast后移继续判断。原创 2024-05-10 10:15:15 · 544 阅读 · 0 评论 -
代码随想录:二分查找相关题目推荐(69、367)
给你一个非负整数x,计算并返回x的。由于返回类型是整数,结果只保留,小数部分将被不允许使用任何内置指数函数和算符,例如或者x ** 0.5。x = 42x = 828 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。原创 2024-05-09 11:43:36 · 204 阅读 · 0 评论 -
代码随想录:二分查找相关题目推荐(35、34)
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。示例 1:nums = [[3,4]示例 2:nums = [[-1,-1]示例 3:[-1,-1]原创 2024-05-08 11:40:30 · 291 阅读 · 0 评论 -
代码随想录:二叉树31-33
改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。排列,请你将其转换为一棵平衡二叉搜索树。通过修剪二叉搜索树,使得所有节点的值在。的新值等于原树中大于或等于。给你二叉搜索树的根节点。原创 2024-04-29 20:38:03 · 161 阅读 · 0 评论 -
代码随想录:二叉树29-30
对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。给定一个二叉搜索树的根节点。,删除二叉搜索树中的。原创 2024-04-28 18:18:13 · 548 阅读 · 0 评论 -
代码随想录:二叉树25-28
给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回 BST 中的所有(即,出现频率最高的元素)。如果树中有不止一个众数,可以按返回。[2]原创 2024-04-28 16:34:04 · 849 阅读 · 0 评论 -
代码随想录:二叉树22-24
返回以该节点为根的子树。如果节点不存在,则返回。差值是一个正数,其数值等于两值之差的绝对值。,判断其是否是一个有效的二叉搜索树。你需要在 BST 中找到节点值等于。给定二叉搜索树(BST)的根节点。给你一个二叉搜索树的根节点。给你一个二叉树的根节点。原创 2024-04-26 11:09:03 · 393 阅读 · 0 评论 -
代码随想录:二叉树18-21(Java)
是同一棵树的后序遍历,请你构造并返回这颗。,请构造二叉树并返回其根节点。是二叉树的中序遍历,原创 2024-04-25 17:33:23 · 258 阅读 · 0 评论 -
代码随想录:二叉树15-17
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。的路径,这条路径上所有节点值相加等于目标和。等于目标和的根节点到叶节点路径如上图所示。路径总和等于给定目标和的路径。假设二叉树中至少有一个节点。和一个表示目标和的整数。,返回所有左叶子之和。是指没有子节点的节点。是指没有子节点的节点。原创 2024-04-25 15:16:24 · 353 阅读 · 0 评论 -
代码随想录:二叉树13
1.前序递归回溯前序递归回溯的逻辑是,用path存储单条路径,用result存储所有路径。先处理中间节点,加入到path中。终止条件是遇到叶子节点,就把path转为对应的String并添加到result中。单层逻辑是,分别递归回溯处理每个左右孩子。原创 2024-04-20 15:33:07 · 565 阅读 · 0 评论 -
代码随想录:二叉树9-10(二叉树的深度)
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。是指从根节点到最远叶子节点的最长路径上的节点数。给定一个 N 叉树,找到其最大深度。给定一个二叉树,找出其最小深度。叶子节点是指没有子节点的节点。原创 2024-04-18 18:05:04 · 329 阅读 · 0 评论 -
代码随想录:二叉树6-8
翻转二叉树可以用前序、后序、层序遍历,一边遍历时一边翻转当前遍历节点的左右指针即可。对比单纯的遍历二叉树,就是把遍历节点值add到result的操作,修改为swap(cur)即可。所以只要熟练二叉树的递归和迭代遍历,加上想清楚这道题在遍历时增加什么操作即可。核心算法还是二叉树的遍历。原创 2024-04-18 12:07:39 · 361 阅读 · 0 评论 -
代码随想录:二叉树5(层序遍历全解)
第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历), 以数组的形式返回每一层节点的平均值。(即逐层地,从左到右访问所有节点)。因此返回 [3, 14.5, 11]给定一个非空二叉树的根节点。以内的答案可以被接受。原创 2024-04-17 12:21:37 · 378 阅读 · 0 评论 -
代码随想录:二叉树2-4
1.递归的核心要确定三个点:①递归函数的形参是什么,用到什么参数:根节点指针+遍历返回的数据列表②递归的终止条件是什么:访问到空节点③递归的一层是什么逻辑:先获取中间节点元素,再访问左子孩子,最后访问右子孩子。2.迭代法的逻辑如下:中间节点先入栈,然后中间节点出栈时,连续执行三个操作,add中,如果右子节点非空把右进栈,如果左子节点非空把左进栈。以123为例,1作为根节点(中间节点)先入栈。原创 2024-04-12 11:28:46 · 709 阅读 · 0 评论 -
代码随想录:栈与队列4-6
1.思想要判断左右括号匹配,优先用栈来解决。大致算法是,如果是左括号就让其进栈,如果是右括号就把栈顶元素取出来匹配一下,如果不匹配就返回false,匹配就把栈底元素出栈。不过要把所有不匹配的情况考虑清楚:(1)第一种:左括号多,那么for循环结束之后的栈是非空的(2)第二种:右括号多,那么遍历到右括号时栈已经是空了(3)第三种就:左右括号数量匹配但是内容不匹配。还有要想一下,如何做左右括号的匹配,其实就是让左括号进栈的时候,替换为对应的右括号就行。2.算法流程。原创 2024-04-10 18:44:56 · 684 阅读 · 0 评论 -
栈与队列(Java中的栈和队列如何定义)
Stack/Queue/Deque/ArrayDeque/LinkedList原创 2024-04-10 13:16:54 · 1153 阅读 · 0 评论 -
代码随想录:栈与队列2-3
1.思路队列的队尾输入元素,队头输出元素。那么,可以用一个输入栈,模拟队列的输入,用一个输出栈,模拟队列的输出。而且,输入栈的元素和队列的队尾输入元素顺序一致。但输出栈的元素如果要和输入顺序一致,需要从输入栈从移入。下面举例说明了如何用输入栈和输出栈模拟队列,以及两个栈的元素如何移动。2.算法流程(1)push函数直接in.push(x)即可,把队列的队尾元素push到in栈内。(2)pop函数由于输入栈的元素顺序不是我们想要的输出顺序,因此要把in栈的元素pop出来再push到out栈里。原创 2024-04-09 12:16:46 · 747 阅读 · 0 评论