leetcode题解
文章平均质量分 55
一根老麻花
这个作者很懒,什么都没留下…
展开
-
LeetCode每日一题 | 2670. 找出不同元素数目差数组
可以先进行一次遍历,用哈希表存储数组中每个元素的个数。然后第二遍遍历计算前缀和后缀只差。的 不同元素数目差 数组可以用一个长度为。特别需要说明的是,如果。中不同元素的数目 减去 后缀。的 不同元素数目差 数组。结束的子数组(包含下标。原创 2024-01-31 00:22:12 · 286 阅读 · 0 评论 -
LeetCode每日一题 | 670. 最大交换
因此,我们只需要从右往左遍历(从个位开始),遍历过程中,记录右边数字的最大值。然后判断当前值是否比右边数字的最大值要小,若符合则交换这两个数,则可使交换后的数比原数要大。给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。交换一次数字中的任意两位。原创 2024-01-22 22:35:31 · 506 阅读 · 0 评论 -
LeetCode每日一题 | 2645. 构造有效字符串的最少插入数
给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。剩余部分就是简单模拟(LeetCode最近的每日一题怎么都这么水,2333)如果字符串可以由 “abc” 串联多次得到,则认为该字符串有效。原创 2024-01-11 23:45:05 · 412 阅读 · 0 评论 -
LeetCode每日一题 | 2696. 删除子串后的字符串最小长度
观察删除和拼接的规律,可以发现可以使用栈进行模拟,即通过将元素弹出栈来模拟删除的过程。你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 “AB” 或 “CD” 子字符串。通过执行操作,删除所有 “AB” 和 “CD” 子串,返回可获得的最终字符串的 最小 可能长度。注意,删除子串后,重新连接出的字符串可能会产生新的 “AB” 或 “CD” 子串。由于题目要求删除所有"AB"和“CD”子串,并将字符串重新拼接。将字符串全部遍历结束后,栈内元素就是最终字符串的最小可能长度。原创 2024-01-10 21:23:27 · 356 阅读 · 0 评论 -
LeetCode每日一题 | 2707. 字符串中的额外字符
给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串,每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。请你采取最优策略分割 s ,使剩下的字符 最少 。仔细观察这道题可以发现,可以转化成背包问题。状态定义:表示的所有分割策略中,剩下字符的最小值。状态计算:遍历单词字典中的所有字符串(看成物品),若字典中字符串的长度小于等于字符串(物品体积小于背包体积),则计算分割出该字符串是否能使原创 2024-01-09 21:32:33 · 491 阅读 · 0 评论 -
LeetCode每日一题 | 383. 赎金信
在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的。剩下的部分就是简单的链表遍历以及插入新结点的问题。是可以被两个数字整除的最大正整数。,每个结点包含一个整数值。请你返回插入之后的链表。原创 2024-01-07 21:00:32 · 722 阅读 · 0 评论 -
LeetCode每日一题 | 2807. 在链表中插入最大公约数
在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的。剩下的部分就是简单的链表遍历以及插入新结点的问题。是可以被两个数字整除的最大正整数。,每个结点包含一个整数值。请你返回插入之后的链表。原创 2024-01-06 22:33:53 · 636 阅读 · 0 评论 -
LeetCode每日一题 | 1944. 队列中可以看到的人数
他右边另一个人的条件是这两人之间的所有人都比他们两人。最后,判断此时栈是否为空,若不为空,要再加上。右边所可能看到的对象(单调递增的序列)。挡住了后面所有的人,则信息蕴含在。记遍历过程中,当前要研究的对象为。所能看到的最后一个人,即第一个比。个人在他右侧队列中能。原创 2024-01-05 19:35:37 · 628 阅读 · 0 评论 -
LeetCode每日一题 | 2397. 被列覆盖的最多行数
对于满足 matrix[row][col] == 1 的每个单元格 matrix[row][col](0原创 2024-01-04 22:34:10 · 551 阅读 · 0 评论 -
LeetCode每日一题 | 2487.从链表中移除节点
返回修改后链表的头节点 head。给你一个链表的头节点 head。移除每个右侧有一个更大数值的节点。原创 2024-01-03 20:40:20 · 342 阅读 · 0 评论 -
LeetCode-2008. 出租车的最大盈利
你驾驶出租车行驶在一条有 个地点的路上。这 个地点从近到远编号为 到 ,你想要从 开到 ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。乘客信息用一个下标从 0 开始的二维数组 表示,其中 表示第 位乘客需要从地点 前往 ,愿意支付 元的小费。每一位 你选择接单的乘客 ,你可以 盈利 元。你同时 最多 只能接一个订单。给你 和 ,请你返回在最优接单方案下,你能盈利 最多 多少元。注意:你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。预处理:将所有原创 2024-01-02 17:18:15 · 375 阅读 · 0 评论 -
LeetCode-827. 最大人工岛
为了方便实现并查集,将二维坐标转换为一维上的点,计算公式为。由一组上、下、左、右四个方向相连的。最后,对所有连通块大小取最大值。中最大的岛屿面积是多少?原创 2023-12-28 20:55:23 · 550 阅读 · 0 评论 -
LeetCode-28. 找到字符串中第一个匹配项的下标
next 数组的求法是通过模板串自己与自己进行匹配操作得出来的。这样可以避免重复比较已经匹配的部分,提高效率。字符串的第一个匹配项的下标(下标从 0 开始)。这个子串的最长相同前后缀的长度。的某个字符不匹配,那么我们可以将。原创 2023-12-19 20:53:40 · 405 阅读 · 0 评论 -
LeetCode-684. 冗余连接
合并两个集合查询某个元素的祖宗节点。原创 2023-12-16 22:01:56 · 353 阅读 · 0 评论 -
LeetCode-152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。在状态更新过程中,同时更新子数组乘积的最大值。当所有元素都已遍历完成时,则得到全局的最大值。测试用例的答案是一个 32-位 整数。子数组 是数组的连续子序列。原创 2023-12-14 21:59:52 · 392 阅读 · 0 评论 -
LeetCode-23. 合并 K 个升序链表
【代码】LeetCode-23. 合并 K 个升序链表。原创 2023-12-13 22:00:50 · 846 阅读 · 0 评论 -
LeetCode-42. 接雨水
上述流程执行完成后,此时栈顶元素的高度大于等于当前元素的高度,当前元素是潜在的左墙体,因此压入单调栈中。若栈不为空,且栈顶元素的高度值小于当前元素的高度值,原创 2023-12-12 16:05:11 · 418 阅读 · 0 评论 -
LeetCode-4. 寻找两个正序数组的中位数
对于寻找两个正序数组的中位数,可以进一步普适化成寻找两个正序数组中第 k 小的数。面对这类问题,可以使用分治的思路,将查找的时间复杂度降低到。:在两个数组中找到第 k 小的数,可以分解成比较两个数组的第。:排除了一些不可能的元素后,重新更新。和数组的起始下标,缩小搜索范围。原创 2023-12-11 11:55:25 · 1093 阅读 · 0 评论 -
LeetCode-10. 正则表达式匹配
这道题的难点主要在于号的匹配,这里记表示和能否完成匹配,先根据特殊情况归纳总结:对上述进行归纳可得:状态定义:表示和能否完成匹配状态转移:若,可能的状态转移如下:边界情况:原创 2023-12-10 17:32:45 · 458 阅读 · 0 评论 -
LeetCode-18.四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。没什么区别,外层遍历下标,内层使用双指针算法进行查找四数之和等于目标值。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。原创 2023-12-09 22:27:40 · 458 阅读 · 0 评论 -
LeetCode-15. 三数之和
的右区间两端向内侧分别进行滑动。先对整体数组进行升序排序,并指定三个指针。从下标 0 开始遍历数组,剩下的两个指针。你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。,判断是否存在三元组。原创 2023-12-07 21:34:20 · 407 阅读 · 0 评论 -
LeetCode每日一题 | LeetCode-1094.拼车
给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi。求完差分数组后,对差分数组进行前缀和计算,就可以得到每个站点的乘客数量,与车的最大容量进行比较便可得到最终答案。数组,利用差分数组的思想,修改某段区间。因此,我们可以使用一个长度为 1000 的数组来记录每个位置的乘客数量。原创 2023-12-02 23:10:01 · 521 阅读 · 0 评论 -
LeetCode-300.最长递增子序列
若 i < j,且 dp[i] > dp[j],则必然可以从以 dp[j]为结尾的最长上升子序列的末尾删除 j - i 个数,得到长度为 i,结尾为 x 的上升子序列。考虑贪心的策略,若要使上升子序列尽可能地长,则需要让子序列的上身速度尽可能地慢,因此我们每次要在子序列后面加上一个尽可能小的数,这样才能让我们的上升子序列尽可能地长。由 dp[i]关于 i 单调递增的性质,便可以使用二分查找的策略,找到末尾小于当前数的最长子序列,将整体的时间复杂度降为 O(nlogn)。原创 2023-11-27 23:26:41 · 323 阅读 · 0 评论 -
拓扑排序 | LeetCode-210.课程表 Ⅱ
遍历队列中的元素,将队列的元素加入结果数组,同时,将该可修课程的后继课程的入度减 1,判断后继课程此时的入度是否为 0。若入度为 0,表明所有前继课程均已修完,可以加入队列。若所有课程均加入结果数组,则说明存在这样的一个拓扑序列;否则不可能完成所有课程,返回一个空数组。,其中 n 为课程数,m 为先修课程的要求数。使用广度优先搜索的策略,先将所有入度为 0 的课程加入队列,表明没有前置课程未修。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回。如果不可能完成所有课程,返回。原创 2023-11-26 22:23:22 · 361 阅读 · 0 评论 -
染色法判断二分图 | LeetCode-785. 判断二分图
定义:如果能将一个图的节点集合分割成两个独立的子集。,并使图中的每一条边的两个节点一个来自。其中每个节点都有一个介于。分别是无向图中的点数和边数。是一个节点数组,由节点。,都存在一条位于节点。集合,就将这个图称为。如果图是二分图,返回。原创 2023-11-25 21:51:53 · 367 阅读 · 0 评论 -
动态规划 | LeetCode-91.解码方法
通过上述状态转移方程,我们可以发现,转移 dp[i+1]时,只依赖 dp[i] 和 dp[i-1] 两个状态。因此,我们可以采用与滚动数组类似的思路,只创建长度为 3 的数组,通过取余的方式来复用不再需要的下标。原创 2023-11-23 22:33:48 · 333 阅读 · 0 评论 -
面试经典150题 | LeetCode-97.交错字符串
的定义与过程如下,其中每个字符串都会被分割成若干。行相关,因此,我们就可以将空间维度缩减成一维。这里我们可以观察到,状态。原创 2023-11-22 21:54:43 · 23 阅读 · 0 评论 -
面试经典150题 | 191. 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。这里可以用到计算机位运算的技巧,简化问题求解的时间复杂度。这样,我们最终进行的与操作次数就是。时间复杂度:取决于二进制中 1 的个数。通过不断执行上述的与操作,直到二进制。二进制数中 1 的个数。原创 2023-11-19 22:44:59 · 28 阅读 · 0 评论 -
区间 DP | LeetCode-312. 戳气球
有 个气球,编号为 到 ,每个气球上都标有一个数字,这些数字存在数组 中。现在要求你戳破所有的气球。戳破第 个气球,你可以获得 枚硬币。 这里的 和 代表和 相邻的两个气球的序号。如果 或 超出了数组的边界,那么就当它是一个数字为 的气球。求所能获得硬币的最大数量。考虑戳破编号从 i 到 j 的气球,所能获取硬币的最大值。我们假设,最后戳破的气球的编号为 k ,则所能获取硬币的最大值是从 i 到 k -1 的最大值加上从 k+1 到 j 的最大值,最后加上戳破 k 所能获取的硬币数。通过遍原创 2023-11-18 22:00:13 · 32 阅读 · 0 评论 -
面试经典 150 题 | LeetCode-209.长度最小的子数组
用两个指针 i 和 j 分别表示滑动窗口的开始位置和结束位置,维护滑动窗口内子数组之和。,则更新子数组的最小长度。同时让指针 j 也不断的向右移动,减小滑动窗口的大小,直到。每一轮迭代,指针 i 不断的向右移动,扩大滑动窗口的大小。如果滑动窗口内子数组之和。,并返回其长度**。**如果不存在符合条件的子数组,返回。移动过程中,更新子数组的最小长度。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。原创 2023-11-16 22:06:19 · 34 阅读 · 0 评论 -
动态规划 | LeetCode-343.整数划分
给定一个正整数 ,将其拆分为 个 正整数 的和( ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。将正整数 n 拆分为 k 个正整数的和,情况比较多,我们可以先考虑简化版本,即将正整数拆分成 2 个正整数的和,求乘积的最大值。若只拆分成两个数,对于正整数 n,我们只需要遍历整数 i,使得的值取最大即可。接下来,我们进一步考虑拆分成 k 个正整数的情况。可以采用递归求解的思想思考该问题,定义表示将整数 i 拆分成 2 个及 2 个以上正整数的和,对应乘积的最大值。将整数 n 拆分成 2 个正原创 2023-11-15 10:58:01 · 50 阅读 · 0 评论 -
双指针 | 两数之和 II - 输入有序数组
如果两个指针指向的元素值之和等于目标值,则返回指针所指元素下标;若元素之和小于给定值,则将左边的指针右移一位;若元素之和大于给定值,则将右边的指针左移一位。这道题是一个典型的用双指针求解的问题。一个指针初始指向最小元素,即数组最左边,向右遍历;另一个指针初始指向最大元素,即数组最右边,向左遍历。,请你从数组中找出满足相加之和等于目标数。你所设计的解决方案必须只使用常量级的额外空间。最坏情况下,只需要遍历一遍数组,时间复杂度是。的形式返回这两个整数的下标。以长度为 2 的整数数组。重复使用相同的元素。原创 2023-11-14 21:41:44 · 24 阅读 · 0 评论 -
Leetcode:104. 二叉树的最大深度
题目给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7]原题链接:104. 二叉树的最大深度知识点:递归广度优先搜索解题思路解法一:递归左右子树递归,取最大AC代码class Solution { public int maxDepth(TreeNode root) { if(root == null)原创 2020-07-28 15:06:22 · 58 阅读 · 0 评论 -
Leetcode:1025. 除数博弈
题目爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。原题地址:1025.除数博弈解题思路作为一个蒟蒻,刚开始看题是有点懵逼的,后来枚举了数字2~1原创 2020-07-24 18:02:01 · 81 阅读 · 0 评论 -
Leetcode:64.最小路径和
题目给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。原题链接64.最小路径和涉及知识点:动态规划解题思路这是一道典型的动态规划问题首先,我们要判断题目所给的这个二维数组是不是空数组,如果是空数组,直接返回0。接着,我们需要创建一个与原始数组规模一样的数组:dp[m][n],其中dp[i][j]表示从(0,0)点到(i,j)的最短路径。显然dp[0][0] = grid[0][0]。进一步,列出原创 2020-07-23 11:49:10 · 108 阅读 · 0 评论 -
Leetcode签到题:旋转数组的最小数字(一只菜鸡的刷题路)
剑指 Offer 11. 旋转数组的最小数字题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。题目链接:剑指 Offer 11. 旋转数组的最小数字来源:力扣(LeetCode)涉及的知识点:二分查找求解思路题目所给旋转数组的特点:设数组的最后一个元素为x,该数组最小的元素为min。原数组中,min左边的所有元素原创 2020-07-22 15:56:37 · 131 阅读 · 0 评论