
LeetCode
文章平均质量分 65
seniusen
一个乐观的终身学习者!
展开
-
LeetCode 刷题汇总——题目序号顺序版
剑指 Offer——和为 S 的两个数字剑指 Offer——数字在排序数组中出现的次数剑指 Offer——和为 S 的连续正数序列剑指 Offer——最小的 K 个数剑指 Offer——连续子数组的最大和剑指 Offer——数组中的逆序对LeetCode 1——两数之和LeetCode 2——两数相加LeetCode 3——无重复字符的最长子串LeetCode 4——两个排序数组中的中位数LeetCode 5——最长回文子串LeetCode 10——正则表达式匹配LeetCode 19原创 2024-04-10 22:54:46 · 859 阅读 · 0 评论 -
LeetCode 124 —— 二叉树中的最大路径和
这样的一棵树总共有六条路径,分别是:根节点、左节点-根节点、右节点-根节点、左节点、右节点、左节点-根节点-右节点,我们用一个大小为 6 的数组。接下来,我们再考虑一个更复杂的树,这棵树的根节点有左右两棵子树,每一棵子树都是类似上面示例 1 的一棵树。需要注意,当某一个节点为空的时候,比如左节点为空,那么左节点-根节点路径和为根节点的值,左节点贡献值为 0。二叉树的问题首先我们要想想是否能用递归来解决,本题也不例外,而递归的关键是找到子问题。来分别表示这六条路径的路径和,那么所求的最大路径和即为。原创 2024-05-26 12:26:52 · 743 阅读 · 0 评论 -
LeetCode 264 —— 丑数 II
之后得到的数字序列。然后,每一次,我们只需要从这三个队列头部取一个最小的元素作为下一个丑数即可。当三个队列有一个为空的时候,我们就取出下一个丑数,分别填充到三个队列中去。上面的方法可以进一步优化,其实每一次比较的时候我们只用到了三个队列头部的元素,而三个队列头部的元素又分别是某一个丑数乘以。,所以后面的丑数肯定是前面的丑数分别乘以。,由于丑数的质因子只包含。,分别代表前面的丑数乘以。这样,我们维护三个队列,后得到的数字,所以,原创 2024-05-21 22:52:49 · 1061 阅读 · 0 评论 -
LeetCode 279 —— 完全平方数
此图利用动态规划进行求解,首先,我们求出小于。,也可以省略,直接在第二个循环得到。的所有完全平方数,存放在数组。原创 2024-05-21 21:03:06 · 1188 阅读 · 0 评论 -
LeetCode 207 —— 课程表
第一种思路是在图中进行深度优先搜索,一开始,每个节点的状态都设置为。针对每一个没有被访问的节点,我们将其状态设置为。代表每一门课程需要先学习的课程总数。,那么它需要先学习的课程总数就减少了一门。如果当前节点的所有边都访问完了,则将其状态设置为。,那么这门课程就可以完成学习,我们将其放入队列。首先,我们建立一个有向图,如果学习课程。首先还是建立一个有向图,只不过这次,,那么所有课程也就都可以完成学习了。的所有边,对所有下一个节点的。需要先学习的课程总数为。此时,如果有另一门课程。最后,如果所有课程的。原创 2024-05-21 20:20:19 · 1014 阅读 · 0 评论 -
LeetCode 131 —— 分割回文串
然后在每个切割次数下,切割位置可以任意选择。而每一个切割方案我们都需要遍历字符串一次,时间复杂度为。最坏的情况下,字符串中所有的字符都相等,那么怎么分割都是对的,假设字符串长度为。以此类推,直到把整个字符串切割完毕,就得到了其中的一个分割方案。,这样我们就知道了所有的子串是否是回文子串。,所以,算法的整体时间复杂度为。是回文子串,那么我们就在第。是回文子串,那么我们就在第。中的思路,我们先求出。个位置进行第一次分割。个位置进行第二次分割。原创 2024-05-02 17:09:57 · 1116 阅读 · 0 评论 -
LeetCode 139 —— 单词拆分
可以被字典中出现的单词拼接,并且。由于需要两层循环,所以时间复杂度为。,另外,我们需要一个哈希表来存储。同时,我们定义空字符串。原创 2024-05-02 15:37:45 · 1194 阅读 · 2 评论 -
LeetCode 15 —— 三数之和
首先我们对数组进行从小到大排序,然后遍历数组。,由于三元组的索引互不相同,所以余下的。个也即最后一个元素。同时,结果中不能包含重复的三元组,所以。后面的元素中取,而且。原创 2024-05-02 11:32:04 · 1188 阅读 · 2 评论 -
LeetCode 11—— 盛最多水的容器
虽然可以跳过一些循环,代码也通过了测试,但时间复杂度仍然是。会变小,容器面积肯定会变小,所以我们只能让垂线。组成的容器可以盛的水最多,那么我们把垂线。往左移动,那么容器的高度不会大于。暴力法,遍历所有可能的垂线对。,应该会有更高效的解决办法。如果这时候我们让垂线。,盛的水肯定会变多。原创 2024-05-01 23:22:23 · 1083 阅读 · 0 评论 -
LeetCode 213 —— 打家劫舍 II
所以,第一种方案就是不偷窃最后一个房屋,那么我们从第一个房屋偷到倒数第二个房屋,看看这样能偷窃到的最大值是什么。第二种方案则是从最后一个房屋偷到第二个房屋,这样也有一个最大的偷窃金额。而这两种方案的较大值也就是我们题目所求。原创 2024-05-01 22:18:32 · 441 阅读 · 1 评论 -
LeetCode 198—— 打家劫舍
所以取前一个房间不偷窃可以获得的最大金额再加上当前房屋的价值。个房屋可以获得的最高金额。有关系,所以,我们只需要两个状态值即可。个房屋可以获得的最高金额,而。此题使用动态规划求解,假设。,所以取二者的最大值。原创 2024-05-01 22:11:04 · 1221 阅读 · 0 评论 -
LeetCode 69—— x 的平方根
的时候均成立,但由于我们这里求的是整数,所以则是当。需要注意,为了避免求平方的时候整数溢出,需要选用。轴的交点足够接近,那么我们就得到方程的解了。的关系,然后找到最后一个平方小于等于。的值,我们可以用牛顿迭代法来求解。的时候我们可以将搜索区间缩短为。处作新的切线,如果两次切线与。实际上,我们所求的即是方程。二分查找法,对于整数。原创 2024-05-01 17:14:02 · 838 阅读 · 1 评论 -
LeetCode 面试题 17.14 —— 最小 k 个数
个元素开始遍历,如果其小于堆顶元素,那么就拿它替换掉堆顶元素,并将其插入到堆中的合适位置,最后,整个数组都访问后留在堆中的。,那么我们要找的分区点就落在右边区间,我们去右边区间继续递归寻找。第一种方法就是利用快速排序,第一次排序后,数组被划分为了左右两个区间。,那么我们要找的分区点就落在左边区间,我们去左边区间继续递归寻找。个元素建一个大顶堆,树顶的元素是最大的,然后,从第。,那么左边的区间就正好是我们要找的最小的。第二种方法就是利用堆,我们对数组前。个元素即是我们所求。原创 2024-05-01 12:47:54 · 1383 阅读 · 0 评论 -
LeetCode 面试题 17.08 —— 马戏团人塔
为什么身高相等的情况下,要按照体重从高到低排序呢?因为,如果按照体重从低到高排序的话,第二个步骤身高相等的人就会满足体重的上升子序列,但实际上,题目要求的则是上面的人要比下面的人高一点,这时候,序列已经满足了在上面的人要比下面的人矮一点,然后,我们只需要保证提取到一个最长的体重的上升子序列即可。而如果体重按照升序排列的话,那么身高是。首先,我们对人的身高按照从小到大排序,,最终满足要求的其中一个序列是。的解答思路,贪心+二分查找。,这是不满足题意要求的。原创 2024-04-27 16:13:03 · 1095 阅读 · 0 评论 -
LeetCode 面试题 08.02——迷路的机器人
此题就是一个典型的图搜索题,一种就是广度优先搜索,一种就是深度优先搜索。原创 2024-04-26 21:06:52 · 222 阅读 · 0 评论 -
LeetCode 315—— 计算右侧小于当前元素的个数
阅读目录1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二1. 题目2. 解题思路一参考 剑指 Offer——数组中的逆序对,我们依然借助于归并排序中的合并操作来计算某个元素右侧小于它的元素个数。如上图最左边所示,第五行开始进行第一次合并过程。因为 11>811>811>8,所以,111111 右边小于它的元素个数加 111,也就是上图最右侧第二行的数组(我们记为 countscountscounts 数组)第 000 个元素变为 111。同理,数字 7原创 2024-04-20 15:55:36 · 1220 阅读 · 0 评论 -
LeetCode 199——二叉树的右视图
所以,我们对树进行层次遍历,保存每一层的节点值,取最后一个值即可。从顶部到底部,从右侧能看到的节点值,也就是。原创 2024-04-17 21:40:43 · 269 阅读 · 0 评论 -
LeetCode 409—— 最长回文串
然后如果某个字符出现了偶数次,那么回文串长度就增加这个字符出现的次数;如果某个字符出现了奇数次,那么回文串长度也只能增加小于这个奇数次的最大偶数。要想组成回文串,那么只有最中间的字符可以是奇数个,其余字符都必须是偶数个。最后,如果存在奇数个的字符,那么中间可以放一个期数字符,回文串长度加 1。所以,我们先遍历一遍字符串,统计出每个字符出现的次数。原创 2024-04-16 22:21:22 · 367 阅读 · 2 评论 -
LeetCode 113—— 路径总和 II
那么只需要将根节点的值插入到这个路径列表中作为第一个元素即可。同理,右子树也是一样。看到树的问题一般我们先考虑一下是否能用递归来做。如果到达了叶子结点,而且叶子结点的值等于。,如果根节点的左子树有一个路径总和等于。如果树是空的,那么直接返回一个空的列表。,那么就返回一个包含叶子结点值的列表。原创 2024-04-15 21:26:08 · 554 阅读 · 3 评论 -
LeetCode 57—— 插入区间
然后,我们遍历结果区间列表,将重叠区间插入到合适的位置即可。第一步,我们先寻找新区间和原始区间列表的重叠部分。因此,我们首先遍历一遍原始区间列表,,原始区间列表中的其中一个区间为。原创 2024-04-14 22:29:50 · 871 阅读 · 0 评论 -
LeetCode 678——有效的括号字符串
从左往右遍历字符串,如果是左括号或者星号,则将位置索引分别入栈,如果遇到右括号,需要两个栈,一个用来保存左括号所在的位置索引,一个用来保存星号所在的位置索引。最终,左括号也匹配完,那么字符串有效,因为余下的星号可以作为空字符串。原创 2024-04-14 18:51:21 · 337 阅读 · 1 评论 -
LeetCode 80—— 删除有序数组中的重复项 II
当然了,上面的思路不容易理清,比较简单的一个实现是利用快慢指针。一开始快慢指针都指向第 3 个元素,如果。指针,二者都前进一步。最后,slow指针指向的位置即为结果所求。,说明重复元素超过了 2 个,只需要向前移动。,最多遍历 2 遍数组,空间复杂度为。指针指向的元素移动到。原创 2024-04-10 21:10:05 · 469 阅读 · 0 评论 -
LeetCode 994—— 腐烂的橘子
【代码】LeetCode 994—— 腐烂的橘子。原创 2024-04-09 22:36:10 · 723 阅读 · 0 评论 -
LeetCode 377——组合总和 Ⅳ
去网上一查,原来 LeetCode 会用这同一个类去测试所有的测试用例,那么我的。如果数组中存在负数的话,会存在一个包含正数和负数的序列,它们的和为 0,也就是说,于是,我开始实现了第一版代码,完全就照着上面的解题思路来写,使用递归。很不幸,还是出错了,看起来是整型数超出表示范围了,一个简单的思路是把。的某个中间变量可能越界了,然后这个中间变量实际上是用不到的。,所以,答案也就是错的了,此路看来也不通!的元素组合的个数,首先,我们遍历。很可惜,没有通过全部测试用例,超时了。然后,如果前两个元素我们都放置。原创 2024-04-09 22:09:16 · 1148 阅读 · 1 评论 -
LeetCode 309—— 买卖股票的最佳时机含冷冻期
为每天这几个状态下对应的最大收益,由于持有股票时不知道是哪天买入的,所以我们还需要知道当天状态是持有股票时的买入股票价格。根据题意,每一天有这样几个状态:买入股票、卖出股票、冷冻期、持有股票,因此,我们假设。中所有的列表都是同一个,修改一个所有的都会跟着变动。天才可以卖出,状态是二者的较大值,所以有。天才可以是持有,这时候,我们需要比较是。天是买入股票或者持有股票,第。天才可以是冷冻期,所以有。获得的价值大,前者的价值是。,如果后者的价值大,则更新。天是卖出或者冷冻期,第。天是买入或者持有,第。原创 2024-03-26 21:51:24 · 967 阅读 · 0 评论 -
LeetCode 1027——最长等差数列
我们初始化所有元素为 -1,然后从前往后开始遍历数组,根据上面的公式依次更新。直接就可以用一个大小为 501 的数组来代替了,数组的下标就可以作为索引。这样,速度和内存都有所提升,但提升得也非常有限。于是,我开始实现了第一版代码,完全就照着上面的解题思路来写。后,通过了,但是执行用时和消耗内存都排在了末尾。就是充当哈希表的作用,不需要有序,没有必要用。,如果不在这个范围,肯定是无效的。很可惜,没有通过全部测试用例,超时了。的等差数列的最大长度,那么,如果。的前面,所以,针对每一个。原创 2024-03-24 21:33:02 · 1010 阅读 · 2 评论 -
LeetCode 516——最长回文子序列
1. 题目2. 解答与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续。我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状态转移方程为:state[i][j]=1 如果 i=jstate[i][j] = 1 \space 如果 \space i = jstate[i][j]=1 如果&n...原创 2019-12-05 18:41:20 · 215 阅读 · 0 评论 -
LeetCode 5——最长回文子串
1. 题目2. 解答我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i-1] == s[j+1],那么 s[i-1, j+1] 也为回文子串。状态转移方程为:state[i][j]=1 如果 i=jstate[i][j] = 1 \space 如果 \space i = jstate[i][j...原创 2019-12-05 18:38:13 · 278 阅读 · 2 评论 -
LeetCode 300——最长上升子序列
1. 题目2. 解答2.1. 动态规划我们定义状态 state[i] 表示以 nums[i] 为结尾元素的最长上升子序列的长度,那么状态转移方程为:state[i]=max(state[j]+1) 如果 nums[i]>nums[j],0⩽j<istate[i] = max(state[j] + 1) \space 如果 \space nums[i] &g...原创 2019-12-05 18:36:45 · 232 阅读 · 0 评论 -
LeetCode 10——正则表达式匹配
1. 题目2. 解答在 回溯算法 中我们介绍了一种递归的思路来求解这个问题。此外,这个问题也可以用动态规划的思路来解决。我们定义状态 P[i][j]P[i][j]P[i][j] 为子串 s[0,i)s[0, i)s[0,i) 和 p[0,j)p[0, j)p[0,j) 是否匹配,能匹配为真,反之为假,然后状态转移方程则可以分为以下三种情况:如果 p[j-1] != ‘*’ &...原创 2019-12-03 21:49:24 · 363 阅读 · 1 评论 -
剑指 Offer——和为 S 的两个数字
1. 题目2. 解答由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较。若小于目标和,第一个指针向前移动;若大于目标和,第二个指针向后移动。若等于目标和,题目中要求输出乘积最小的。由于两个元素的乘积肯定小于目标和的平方,因此我们初始化目标和的平方为一个最小乘积。当找到两个元素和等于目标和的时候,如果他...原创 2019-03-30 13:42:35 · 402 阅读 · 1 评论 -
剑指 Offer——数字在排序数组中出现的次数
1. 题目2. 解答时间复杂度为 O(n)O(n)O(n) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数。class Solution {public: int GetNumberOfK(vector<int> data ,int k) { int n = data.size(); if (n == 0) ...原创 2019-03-30 13:43:57 · 174 阅读 · 1 评论 -
剑指 Offer——和为 S 的连续正数序列
1. 题目2. 解答定义两个指针,刚开始分别指向 1 和 2,求出位于这两个指针之间的元素和。如果和大于 S,前面的指针向后移直到和不大于 S 为止;反之,如果和等于 S,则此时两个指针之间的元素序列即为一个所求的结果,后面的指针向后移动。第一个指针的范围为 [1,S+12)[1, \frac{S+1}{2})[1,2S+1),左闭右开,可举一个奇数偶数的例子即可知。时间复杂度为 O(n...原创 2019-03-30 13:46:54 · 186 阅读 · 1 评论 -
LeetCode 135——分发糖果
1. 题目2. 解答初始化左序奖赏全为 1,从左往右遍历,如果右边的人评分比左边高,右边奖赏比左边奖赏增 1。初始化右序奖赏全为 1,从右往左遍历,如果左边的人评分比右边高,左边奖赏比右边奖赏增 1。左序奖赏和右序奖赏的最大值就是该孩子的最终奖赏值。class Solution {public: int candy(vector<int>& ratings...原创 2019-03-27 15:02:38 · 417 阅读 · 1 评论 -
LeetCode 386——字典序排数
1. 题目2. 解答2.1 方法一假设返回 118 以内数的字典顺序,则为 1,10,100,101,102,…,109,11,110,111,112,…,118,12,13,…。根据这个序列,我们发现有以下几种情况。1,10,100,每次都乘以 10100,101,102,…,109,每次加 1109,11,末尾为 9 则先除以 10 直到末尾不为 9 再加 1118,12,排...原创 2019-03-27 15:05:09 · 373 阅读 · 1 评论 -
LeetCode 440——字典序的第 K 小数字
1. 题目2. 解答字典序排数可以看做是第一层节点分别为 1-9 的十叉树,然后我们在树上找到第 K 小的数字即可。因此,我们需要分别统计以 1-9 为根节点的每个树的节点个数。如果 K 小于当前树的节点个数,那么第 K 小的数字即在当前树中,我们进入子树继续查找;如果 K 大于当前树的节点个数,那么我们需要查找后面树中第 (K - 当前树节点) 小的数字。其中,比较关键的步骤就是统计树中...原创 2019-03-27 15:22:18 · 1156 阅读 · 2 评论 -
LeetCode 845——数组中的最长山脉
1. 题目2. 解答2.1 方法一left 数组表示当前元素左边比当前元素小的元素个数,right 数组数组表示当前元素右边比当前元素小的元素个数。在山脉的中间 B[i] 处,其左边和右边肯定都有小于 B[i] 的元素,而山脉的长度即为 left[i] + right[i] + 1。class Solution {public: int longestMountain(vect...原创 2019-03-27 15:24:40 · 1066 阅读 · 1 评论 -
LeetCode 148——排序链表
1. 题目2. 解答2.1 快速排序可参考 快速排序和归并排序 中的第一种快速排序思想,与在数组中排序有两点不同。第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在单链表中,我们需要先遍历一遍链表才能访问到最后一个元素。第二,在数组中,利用主元将数组划分为左右两个部分后,我们可以用下标来递归调用,但在链表中,我们改用头指针和尾指针来标识左右两个部分。如下图所...原创 2019-03-28 20:55:38 · 2508 阅读 · 3 评论 -
剑指 Offer——连续子数组的最大和
1. 题目2. 解答初始化 sum=0,然后遍历数组进行累加。如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加。初始化 max_sum 为数组的第一个元素,之所以不初始化为零,就是防止出现数组中全为负数的情况,比如 [-2, -1, -3, -4, -5]。在遍历数组的过程中,如果 sum > max_sum,就更新 max_sum=sum...原创 2019-04-27 15:39:02 · 220 阅读 · 1 评论 -
LeetCode 103——二叉树的锯齿形层次遍历
1. 题目2. 解答定义两个栈 s_l_r、s_r_l 分别负责从左到右和从右到左遍历某一层的节点,用标志变量 flag 来控制具体情况,根节点所在层 flag=1 表示从左到右遍历,每隔一层改变一次遍历方向。用栈 s_l_r 从左到右遍历当前层节点时,按照先左子节点再右子节点的顺序将这一层节点的子节点依次放入栈 s_r_l 中。用栈 s_r_l 从右到左遍历当前层节点时,按照先右子节点...原创 2019-05-26 15:55:23 · 219 阅读 · 1 评论