![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode刷题笔记
文章平均质量分 71
记录平时刷题的总结与思路
gyjllll
这个作者很懒,什么都没留下…
展开
-
31. 下一个排列
就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。如果在步骤 1 找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤 2 执行步骤 3,即可得到最小的升序序列。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。该方法支持序列中存在重复元素,且在 C++ 的标准库函数 next_permutation 中被采用。原创 2024-03-25 17:41:00 · 435 阅读 · 0 评论 -
75. 颜色分类
对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。必须在不使用库内置的 sort 函数的情况下解决这个问题。给定一个包含红色、白色和蓝色、共。分别表示红色、白色和蓝色。原创 2024-03-14 18:55:10 · 346 阅读 · 0 评论 -
994. 腐烂的橘子
将预处理阶段找到的腐烂橘子向四个方向开始腐烂,需要记录队列的初始长度,当长度减少到0时算一轮感染。再进行次轮感染,直到队列为空。题目中说每分钟,腐烂的橘子周围四个方向的新鲜橘子会腐烂,且初始时存在多个腐烂橘子,所以很容易想到BFS。左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0。把初始时的腐烂橘子加入队列,并计算新鲜橘子的个数。的新鲜橘子都会腐烂。原创 2024-03-14 17:59:15 · 360 阅读 · 0 评论 -
114. 二叉树展开为链表
具体做法就是,先找到根节点左子树最右边节点,然后把该节点的右子树添加成原来根节点的右子树,然后把根节点的右子树替换成现在根节点的左子树,再把根节点的左子树置为空,接下来将根节点往下移动,也就是root=root->right,直到遍历完。实际上左子树的最右边的结点在先序遍历中一定是当前结点的左子树中最后一个遍历到的,也就是排在当前结点右子树所有节点的前面,对于每一个结点都做相同的操作,直到遍历完。额外空间)展开这棵树吗?你可以使用原地算法(原创 2024-03-14 16:26:47 · 366 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值
我们考虑数组中的最后一个元素 x:在最小值右侧的元素(不包括最后一个元素本身),它们的值一定都严格小于 x;在二分查找的每一步中,左边界为 low,右边界为 high,区间的中点为 pivot,最小值就在该区间内。如下图所示,这说明 nums[pivot]是最小值右侧的元素,因此我们可以忽略二分查找区间的右半部分。如下图所示,这说明 nums[pivot]是最小值左侧的元素,因此我们可以忽略二分查找区间的左半部分。原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。原创 2024-03-14 15:41:15 · 362 阅读 · 0 评论 -
169. 多数元素
突破点 就是众数出现的次数大于其他数据的所有数量,因此可以用一个count去记录数据次数,可以从头开始,例如遍历第一个数,count为1,把第一个数就记成众数,如果接下来和这个数相等,将count累加,众数不改变,遇到和当前众数不相等的数,则把count减一,如果count变成0,说明当前记的众数不是最终答案,需要进行改变,将众数变成当前的值,count重新记录为1,以此类推,直到将数组遍历结束,最终得到众数。你可以假设数组是非空的,并且给定的数组总是存在多数元素。,返回其中的多数元素。原创 2024-03-13 20:15:41 · 337 阅读 · 0 评论 -
136. 只出现一次的数字
假设数组中有 2m+1个数,其中有 m个数各出现两次,一个数出现一次。令 a1、a2、am为出现两次的 m 个数,am+1为出现一次的数。,除了某个元素只出现一次以外,其余每个元素均出现两次。异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。任何数和 000 做异或运算,结果仍然是原来的数,即 a⊕0=a。因此,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。任何数和其自身做异或运算,结果是 000,即 a⊕a=0。对于这道题,可使用异或运算 ⊕。原创 2024-03-13 19:54:30 · 327 阅读 · 0 评论 -
230. 二叉搜索树中第K小的元素
利用中序遍历,二叉搜索树的中序遍历是按照键增加的顺序进行的。于是,我们可以通过中序遍历找到第 k 个最小元素。具体地,我们使用迭代方法,这样可以在找到答案后停止,不需要遍历整棵树。如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第。,请你设计一个算法查找其中第。个最小元素(从 1 开始计数)。给定一个二叉搜索树的根节点。小的值,你将如何优化算法?原创 2024-03-08 22:56:13 · 373 阅读 · 0 评论 -
11. 盛最多水的容器
首先将左指针放在最开始,右指针放在数组末尾,计算面积,高度取两个的最小值。然后往下移动指针,一定是让高度小的指针移动,因为小高度才决定面积,你把大高度往后移,面积只会比原来更小。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。原创 2024-03-08 20:02:39 · 343 阅读 · 0 评论 -
240. 搜索二维矩阵 II
如果matrix[x,y]>target,由于每一列的元素都是升序排列的,那么在当前的搜索矩阵中,所有位于第 y 列的元素都是严格大于 target 的,因此我们可以将它们全部忽略,即将 y 减少 1;如果 matrix[x,y]<target,由于每一行的元素都是升序排列的,那么在当前的搜索矩阵中,所有位于第 x行的元素都是严格小于 target 的,因此我们可以将它们全部忽略,即将 x 增加 1。在搜索的过程中,如果我们超出了矩阵的边界,那么说明矩阵中不存在 target。编写一个高效的算法来搜索。原创 2024-03-08 15:03:08 · 288 阅读 · 0 评论 -
48. 旋转图像
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。使用另一个矩阵来旋转图像。原创 2024-03-08 14:34:10 · 330 阅读 · 0 评论 -
73. 矩阵置零
具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。我们可以用两个标记数组分别记录每一行和每一列是否有零出现。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。原创 2024-03-08 12:06:25 · 333 阅读 · 0 评论 -
238. 除自身以外数组的乘积
初始化 answer 数组,对于给定索引 i,answer[i] 代表的是 i 左侧所有数字的乘积。同理,对于数组 R,R[length-1] 应为 1。我们不必将所有数字的乘积除以给定索引处的数字得到相应的答案,而是利用索引左侧所有数字的乘积和右侧所有数字的乘积(即前缀与后缀)相乘得到答案。对于给定索引 i,L[i] 代表的是 i 左侧所有数字的乘积,R[i] 代表的是 i 右侧所有数字的乘积。当 R 和 L 数组填充完成,我们只需要在输入数组上迭代,且索引 i 处的值为:L[i] * R[i]。原创 2024-03-08 11:14:59 · 354 阅读 · 0 评论 -
189. 轮转数组
先将整个数组翻转,然后把前k个翻转,再把剩下的翻转即可,但要注意这里的k不是题目中的k,k要进行处理,取nums.size的余数,因为k一旦比数组长度长,直接进行reverse翻转会出现异常,例如。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。原创 2024-03-07 22:56:06 · 288 阅读 · 0 评论 -
5. 最长回文子串
上文的所有讨论是建立在子串长度大于 2的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。根据这个思路,我们就可以完成动态规划了,最终的答案即为所有 P(i,j)=true中 j−i+1(即子串长度)的最大值。注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。根据这样的思路,我们就可以用动态规划的方法解决本题。也就是说,只有 s[i+1:j−1]是回文串,并且 s的第 i 和 j个字母相同时,s[i:j]才会是回文串。原创 2024-03-04 18:07:03 · 322 阅读 · 0 评论 -
64. 最小路径和
请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。因为路径 1→3→1→1→1 的总和最小。每次只能向下或者向右移动一步。给定一个包含非负整数的。原创 2024-03-04 08:23:42 · 345 阅读 · 0 评论 -
152. 乘积最大子数组
具体地讲,如果 a={5,6,−3,4,−3}那么此时 fmax对应的序列是 {5,30,−3,4,−3}按照前面的算法我们可以得到答案为 30,即前两个数的乘积,而实际上答案应该是全体数字的乘积。它代表第 i个元素结尾的乘积最大子数组的乘积 fmax(i),可以考虑把 ai加入第 i−1个元素结尾的乘积最大或最小的子数组的乘积中,二者加上 ai ,三者取大,就是第 i 个元素结尾的乘积最大子数组的乘积。的值既不是 −3,也不是 4×(−3),而是 5×6×(−3)×4×(−3)。原创 2024-02-28 22:52:36 · 297 阅读 · 0 评论 -
118. 杨辉三角
动态规划,设定dp数组,先设定它有多少行,然后进入两层循环,外层循环遍历行数,将dp[i]进行resize,每行首尾设成1,然后内层循环进行递推公式,杨辉三角的规律,最后返回dp数组即可。在「杨辉三角」中,每个数是它左上方和右上方的数的和。生成「杨辉三角」的前 numRows。给定一个非负整数 numRows。原创 2024-02-28 21:53:33 · 307 阅读 · 0 评论 -
33. 搜索旋转排序数组
先找分割线,然后分段二分法,分割线指数组前一个数比后一个数大。最开始先判断数组数量是否为1,因为只有一个数等于没旋转。,则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。原创 2024-02-16 09:52:21 · 319 阅读 · 0 评论 -
74. 搜索二维矩阵
两次二分法,在二分法之前,先判断target与边界的关系,超出边界直接为false。,然后再对这一行的数组使用二分法查找,注意二分法区间不变性,使用二分法,把矩阵最后一列看成一维数组,查找target,给你一个满足下述两条属性的。原创 2024-02-16 09:33:50 · 311 阅读 · 0 评论 -
2. 两数相加
具体而言,如果当前两个链表处相应位置的数字为 n1,n2n1,n2n1,n2,进位值为 carry,则它们的和为 n1+n2+carry。如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0。此外,如果链表遍历结束后,有 carry>0\textit{carry} > 0carry>0,还需要在答案链表的后面附加一个节点,节点的值为 carry。因为链表从头结点开始往后,是低位到高位的顺序,因此,只需要从头到尾进行遍历并相加即可,如有进位,就加到下一对节点。的链表,表示两个非负的整数。原创 2024-02-15 22:22:10 · 322 阅读 · 0 评论 -
22. 括号生成
因为我们已经知道一个合法的括号序列,任意前缀中左括号数量一定 >= 右括号数量,因此,如果左括号数量不大于 n,我们就可以放一个左括号,来等待一个右括号来匹配。如果右括号数量小于左括号的数量,我们就可以放一个右括号,来使一个右括号和一个左括号相匹配。题目要求我们生成n对的合法括号序列组合,可以考虑使用深度优先搜索,将搜索顺序定义为枚举序列的每一位填什么,那么最终的答案一定是有n个左括号和n个右括号组成。n是括号对数,lc是左括号数量,rc是右括号数量,str是当前维护的合法括号序列。原创 2024-02-15 21:18:03 · 402 阅读 · 0 评论 -
141. 环形链表
双指针法,快慢指针,从头开始,快指针每次移动两步,慢指针移动一步,如果有环,则会相遇。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。原创 2024-02-15 20:52:49 · 320 阅读 · 0 评论 -
560. 和为 K 的子数组
我们建立哈希表 mp,以和为键,出现次数为对应的值,记录pre[i]出现的次数,从左往右边更新 mp边计算答案,那么以 i结尾的答案 mp[pre[i]−k]即可在 O(1)时间内得到。需要注意的是,从左往右边更新边计算的时候已经保证了mp[pre[i]−k] 里记录的 pre[j]\textit{pre}[j]pre[j] 的下标范围是 0≤j≤i。我们定义 pre[i] 为 [0..i]里所有数的和,则 pre[i]可以由 pre[i−1]递推而来,即。子数组是数组中元素的连续非空序列。原创 2024-02-15 20:39:02 · 364 阅读 · 0 评论 -
3. 无重复字符的最长子串
利用滑动窗口与map,注意统计字符个数不要用count,count函数只要这个键值存在,不管有几个键值,都会返回1,另外本题不要用数组代替map,因为s里面由各种符号组成。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。原创 2024-02-14 22:15:58 · 354 阅读 · 0 评论 -
128. 最长连续序列
定义一维dp数组,dp[i]代表i+1长度的数组中最长连续序列长度。数组要先排序,然后初始化dp,都为1,从前往后遍历nums数组,前后相差1,那么当前dp要加上前一个的dp,如果相等,那么dp赋值成前一个dp,每次算完后,计算下result,和dp取最大值。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为。给定一个未排序的整数数组。原创 2024-02-14 21:35:26 · 351 阅读 · 0 评论 -
广度优先搜索理论基础
我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。我们用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。大家应该好奇,这一圈一圈的搜索过程是怎么做到的,是放在什么容器里,才能这样去遍历。上面我们提过,BFS是一圈一圈的搜索过程,但具体是怎么一圈一圈来搜呢。当然,也有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,原创 2024-02-06 21:45:39 · 308 阅读 · 0 评论 -
深度优先搜索理论基础
又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10。又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。原创 2024-02-06 21:44:36 · 880 阅读 · 0 评论 -
685. 冗余连接 II(困难)
在本问题中,有根树指满足以下条件的图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。输入一个有向图,该图由一个有着n个节点(节点值不重复,从1到n)的树及一条附加的有向边构成。附加的边包含在1到n中的两个不同顶点间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组edges。每个元素是一对[ui, vi],用以表示图中连接顶点ui和顶点vi的边,其中ui是vi的一个父节点。原创 2024-02-06 21:41:32 · 909 阅读 · 0 评论 -
684. 冗余连接
树可以看成是一个连通且的图。给定往一棵n个节点 (节点值1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在1到n中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为n的二维数组edges表示图中在ai和bi之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着n个节点的树。如果有多个答案,则返回数组edges中最后出现的那个。[2,3][1,4]原创 2024-02-06 20:43:13 · 325 阅读 · 0 评论 -
1971. 寻找图中是否存在路径
有一个具有n个顶点的图,其中每个顶点标记从0到n - 1(包含0和n - 1图中的边用一个二维整数数组edges表示,其中表示顶点ui和顶点vi之间的双向边。每个顶点对由边连接,并且没有顶点存在与自身相连的边。请你确定是否存在从顶点source开始,到顶点结束的。给你数组edges和整数nsource和,如果从source到存在,则返回true,否则返回false。true存在由顶点 0 到顶点 2 的路径:- 0 → 2false不存在由顶点 0 到顶点 5 的路径.原创 2024-02-06 20:08:12 · 303 阅读 · 0 评论 -
并查集理论
在第一次查询的时候,相当于是n叉树上从叶子节点到根节点的查询过程,时间复杂度是logn,但路径压缩后,后面的查询操作都是O(1),而 join 函数 和 isSame函数 里涉及的查询操作也是一样的过程。也就是说,无论使用并查集模板里哪一个函数(除了init函数),都会有路径压缩的过程,第二次访问相同节点的时候,这个节点就是直连根节点的,即 第一次访问的时候它的路径就被压缩了。在实现 find 函数的过程中,我们知道,通过递归的方式,不断获取father数组下标对应的数值,最终找到这个集合的根。原创 2024-02-06 15:24:14 · 824 阅读 · 0 评论 -
463. 岛屿的周长
给定一个row x col的二维网格地图grid表示陆地,表示水域。网格中的格子方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100。计算这个岛屿的周长。16它的周长是上面图片中的 16 个黄色的边4401。原创 2024-02-06 12:34:57 · 376 阅读 · 0 评论 -
841. 钥匙和房间
有n个房间,房间按从0到n - 1编号。最初,除0号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。给你一个数组rooms其中rooms[i]是你进入i号房间可以获得的钥匙集合。如果能进入房间返回true,否则返回false。true我们从 0 号房间开始,拿到钥匙 1。原创 2024-02-06 12:01:17 · 785 阅读 · 0 评论 -
127. 单词接龙(困难)
字典wordList中从单词beginWord和endWord的是一个按下述规格形成的序列siwordListbeginWordwordList给你两个单词beginWord和endWord和一个字典wordList,返回从beginWord到endWord的中的。如果不存在这样的转换序列,返回0。5一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。0endWord "cog" 不在字典中,所以无法进行转换。原创 2024-02-06 11:08:43 · 318 阅读 · 0 评论 -
827. 最大人工岛(困难)
给你一个大小为n x n二进制矩阵grid。只能将一格0变成1。返回执行此操作后,grid中最大的岛屿面积是多少?由一组上、下、左、右四个方向相连的1形成。3将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。grid =4将一格0变成1,岛屿的面积扩大为 4。4没有0可以让我们变成1,面积依然为 4。01。原创 2024-02-05 19:01:02 · 377 阅读 · 0 评论 -
417. 太平洋大西洋水流问题
有一个m × n的矩形岛屿,与和相邻。处于大陆的左边界和上边界,而处于大陆的右边界和下边界。这个岛被分割成一个由若干方形单元格组成的网格。给定一个m x n的整数矩阵heights表示坐标(r, c)上单元格。岛上雨水较多,如果相邻单元格的高度当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。返回网格坐标result的,其中表示雨水从单元格(ri, ci)流动。原创 2024-02-05 16:17:16 · 812 阅读 · 0 评论 -
130. 被围绕的区域
给你一个m x n的矩阵board,由若干字符'X'和'O',找到所有被'X'围绕的区域,并将这些区域里所有的'O'用'X'填充。被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'都不会被填充为'X'。任何不在边界上,或不与边界上的'O'相连的'O'最终都会被填充为'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。原创 2024-02-05 14:48:31 · 361 阅读 · 0 评论 -
1254. 统计封闭岛屿的数目
这道题和岛屿数量差不多,但是本题要求是封闭的才算,因此在搜索的时候需要加一个标志位判断这次搜索能否到边界,如果边界有陆地证明这次搜索的连通区域不是封闭岛屿。要注意如果在某次搜索过程中,判断出不封闭,不要结束搜索,仍要进行继续遍历,要把和这个边界连着的所有零都置成1,以便下次搜索。这道题就是去搜索数字0,要将搜索到的0变成1,这样这次搜索完毕后,下次搜索可以避免重复搜到一样的。灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。由1包围(左、上、右、下)的岛。组成的群,封闭岛是一个。原创 2024-02-05 13:56:52 · 327 阅读 · 0 评论 -
1020. 飞地的数量
给你一个大小为m x n的二进制矩阵grid,其中0表示一个海洋单元格、1表示一个陆地单元格。一次是指从一个陆地单元格走到另一个相邻()的陆地单元格或跨过grid的边界。返回网格中在任意次数的移动中离开网格边界的陆地单元格的数量。3有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。0所有 1 都在边界上或可以到达边界。01。原创 2024-02-05 12:48:31 · 345 阅读 · 0 评论