
Leetcode
文章平均质量分 71
若明天不见
时白发未生,轻狂尚有
展开
-
【Leetcode 1052】爱生气的书店老板 —— 滑动窗口
我们可以使用滑动窗口解决本题- 定义`total`为无抑制自己的情绪下满意的客户总数- 定义`increase`为使用滑动窗口抑制情绪,客户从不满足转为满意的增量移动窗口,减去左侧增量,加上右侧增量,依次记录增量最大值。`total + maxIncrease`即为所求原创 2024-04-30 09:56:24 · 368 阅读 · 0 评论 -
【Leetcode 377】组合总和 Ⅳ —— 动态规划
我们可以使用**动态规划**解决本题,解题思路:1. 状态定义: - `dp[i]` 表示总和为i的元素组合的个数2. 状态转移方程:对于总和为i的组合,我们可以选择一个数num,然后在剩余的总和为i - num的情况下选择其他数,所以总的组合个数为dp[i - num]原创 2024-04-29 16:44:37 · 467 阅读 · 0 评论 -
【Leetcode 30】串联所有单词的子串 —— 滑动窗口
滑动窗口:初始化:获取单词列表和单词长度,并初始化结果列表。滑动窗口:通过迭代每个可能的子串起始位置,在字符串中查找符合条件的子串。返回结果:返回符合条件的子串的起始位置列表。原创 2024-04-29 09:50:14 · 823 阅读 · 0 评论 -
【Leetcode 216】组合总和 III —— DFS
穷举所有的可能,做一个「在 9 个数中选择 k 个数」的组合枚举,对于枚举到的所有组合,判断这个组合内元素之和是否为 n原创 2024-04-22 14:59:27 · 358 阅读 · 0 评论 -
【Leetcode 2789】合并后数组中的最大元素 —— 贪心法
从后往前倒序遍历一次数组,依次比较两个相邻的元素,如果两个相邻的元素能够合并,就将其合并。如果不能合并,就继续往前判断在比较过程中,靠后的数是所有操作流程可能性中能产生的最大值,而靠前的数,是所有操作流程可能性中能产生的最小值原创 2024-04-11 10:18:32 · 321 阅读 · 0 评论 -
【Leetcode 1793】好子数组的最大分数 —— 单调栈
1. 维持一个单调递减栈,用于存储数组元素的下标2. 遍历数组 nums,对于每个元素 nums[i],执行以下步骤: - 如果栈不为空且当前元素 nums[i] 小于栈顶元素对应的值 nums[stack.peek()],说明栈顶元素无法成为好子数组的右端点了。此时需要将栈顶元素出栈,并计算以栈顶元素为右端点的最大可能分数。分数计算公式为`nums[stack.pop()] * (i - stack.peek() - 1)`原创 2024-04-10 14:44:16 · 364 阅读 · 0 评论 -
【Leetcode 42】接雨水 ——双指针
解题思路:使用双指针,分别计算当前格与最高格的高度差,即为当前格能接雨水量1. 初始化两个指针 left 和 right,分别表示当前考虑的左边界和右边界,初始值分别为 0 和 n-1,其中 n 是输入数组 height 的长度。2. 初始化两个变量 maxLeft 和 maxRight 来记录 left 和 right 指针所遇到的最高柱子高度。3. 初始化一个变量 res 来记录总的接雨水量。原创 2024-04-10 12:55:57 · 593 阅读 · 0 评论 -
【Leetcode 322】零钱兑换 —— 动态规划
我们可以使用**动态规划**解决本题,解题思路:1. 状态定义:`dp[i]`为组成金额 i 所需最少的硬币数量2. 状态转移方程:枚举 j,需要从dp[i - coins[j] 转移过来,再算上枚举的这枚硬币数量 1 的贡献,由于要硬币数量最少,所以 dp(i) 为前面能转移过来的状态的最小值加上枚举的硬币数量 1原创 2024-04-09 14:21:37 · 774 阅读 · 0 评论 -
【Leetcode 438】找到字符串中所有字母异位词 —— 滑动窗口
在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位原创 2024-03-07 10:20:47 · 436 阅读 · 0 评论 -
【Leetcode 2368】受限条件下可到达节点的数目 —— 图|回溯法
将节点的边使用图或者哈希表存储,从节点`0`开始使用回溯法依次遍历与节点相连且不受限的节点,即为所得原创 2024-03-06 14:14:35 · 406 阅读 · 0 评论 -
【Leetcode 2673】使二叉树所有路径值相等的最小代价 —— 贪心法
对于任一叶结点,它的值为 x,它的兄弟节点的值为 y,要想使得根到这两个叶节点的路径值相等,我们只能增加 x 和 y 本身。**由于我们希望操作次数最少,那么应该进行 ∣x−y∣ 次操作,将较小的值增加至与较大的值相等。原创 2024-03-06 10:47:51 · 942 阅读 · 0 评论 -
【Leetcode 235】二叉搜索树的最近公共祖先 —— 回溯法|二分查找
此题可以使用回溯法或二叉搜索树的性质来解决。原创 2024-03-05 14:07:06 · 354 阅读 · 0 评论 -
【Leetcode 56】合并区间 —— 数组
1. 将列表中的区间按照左端点升序排序2. 将第一个区间加入 result 数组中,并按顺序依次考虑之后的每个区间:如果当前区间的左端点在数组 result 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 result 的末尾;否则,它们重合,我们需要用当前区间的右端点更新数组 result 中最后一个区间的右端点,将其置为二者的较大值原创 2024-03-05 10:38:42 · 416 阅读 · 0 评论 -
【Leetcode 437】路径总和 III —— DFS|递归
穷举所有的可能,我们访问每一个节点 node,检测以 node 为起始节点且向下延深的路径有多少种。我们递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。终止条件:如果遍历的节点累加值为 targetSum;具体思路**:从根节点遍历,递归向左右子树查询节点信息原创 2024-03-04 14:25:40 · 371 阅读 · 0 评论 -
【Leetcode 2583】二叉树中的第K大层和 —— 优先队列 + BFS
解题思路:1.使用队列保存节点,按层序依次保存该层节点;2.使用优先队列保存每层节点值的总和,最后剔除前k个大数即可得到原创 2024-02-29 11:00:20 · 410 阅读 · 0 评论 -
【Leetcode 287】 —— 寻找重复数 |双指针
对 nums 数组建图,**每个位置 i 连一条 i→nums[i] 的边**。由于存在的重复的数字 target ,因此 target 这个位置一定有起码两条指向它的边,因此**整张图一定存在环**,且我们要找到的 target 就是**这个环的入口**,那么整个问题就等价于[环路检测/环形链表 II]原创 2024-02-28 15:00:42 · 547 阅读 · 0 评论 -
【Leetcode 31】下一个排列 ——双指针
1. 从后向前查找第一个 **相邻升序** 的元素对满足 a[i-1] < a[i]。此时 [i,n-1) 必然是**降序**2. 从后向前查找第一个比 a[i-1] 大的数 a[j],交换 a[i-1] 与 a[j]3. 将原本降序的 [i,n-1)序列的所有数 **重置为升序**(升序排列就是最小的排列)原创 2024-02-28 09:50:56 · 412 阅读 · 0 评论 -
【Leetcode LCP 30】魔塔游戏 —— 贪心法|优先队列
依次遍历房间的过程中,`nums[i]`为正数直接加血;`nums[i]`为负数,将其放入一个优先队列中。当计算完第 i 个房间的生命值影响后,如果生命值小于等于 0,从优先队列中取出扣血最多的房间,补回生命值,**视为跳过改房间**。遍历完成后,将延迟的扣血房间累加至生命值,若为负数则无解,返回 -1原创 2024-02-27 14:52:57 · 457 阅读 · 0 评论 -
【Leetcode 2641】二叉树的堂兄弟节点 II —— 广度优先搜索
解题思路:1.使用队列保存节点,按层序依次保存该层节点,计算总和;2.n - 1 层时计算第 n 层的节点值总和,再减去当前节点的子节点值总和,即为堂兄弟的节点值总和原创 2024-02-27 11:37:29 · 381 阅读 · 0 评论 -
【Leetcode 2386】找出数组的第 K 大和 —— 优先队列
可以使用**优先队列**解决本题,解题思路:1. 遍历数组,将数组中正数相加,即为最大子序列和2. 将数组排序,求一个非负数数组的第k小的子序列之和3. 最大子序列和 减 第k小的子序列和 即为所求原创 2024-02-26 14:57:22 · 553 阅读 · 0 评论 -
【Leetcode 993】二叉树的堂兄弟节点 —— 回溯法
解题思路:使用全局变量 depth 及 father 保存第一个搜索到的节点深度和父节点,在搜索到第二个节点时判断深度和父节点即可得出结果原创 2024-02-22 10:16:28 · 467 阅读 · 0 评论 -
【Leetcode 75】颜色分类 ——双指针
第一次遍历替换所有0至数组前端,第二次遍历替换所有1至所有0的末尾。如果要在一次遍历中完成排序,我们可以使用双指针解决本题,指针`p0`从数组首开始,指针`p2`从数组末尾开始,遍历数组的过程中将2替换至末尾,然后将0替换至数组头,即可完成排序原创 2024-02-21 15:15:45 · 436 阅读 · 0 评论 -
【Leetcode 2712】使所有字符相等的最小成本 —— 贪心法
对于坐标 i,假设数组左侧的字符已经相等,如果`s[i−1]≠s[i]`则要反转,成本为$min{i, n - 1}$。相加每次的反转成本即为所求原创 2024-02-21 14:19:02 · 524 阅读 · 0 评论 -
【Leetcode 1696】跳跃游戏 VI —— 动态规划
每一个位置的最大值取决于前面 k 步的最大得分,再加上当前位置的得分。我们可以使用**动态规划**解决本题,解题思路:状态定义:`dp[i]`为到达位置 i 的最大得分原创 2024-02-20 14:39:30 · 1074 阅读 · 0 评论 -
【Leetcode 2415】反转二叉树的奇数层 —— 回溯法 | BFS
可以使用回溯法或广度优先搜索BFS解决此题;回溯法解题思路为1.左节点的左子树 & 右节点的右子树 值互换;2.左节点的右子树 & 右节点的左子树 值互换原创 2024-02-20 10:22:42 · 615 阅读 · 0 评论 -
【Leetcode 1686】石子游戏 VI —— 贪心法
这轮选择的分差为$(a_i - b_j) - (a_j - b_i) = (a_i + b_i) - (a_j + b_j)$,可知i的总价值大于j时,选择i,否则选择j;此为收益最大化。故给石头总价值排序,依次选择剩余石头里价值最大的,最后比较结果即为所求原创 2024-02-19 17:20:20 · 1035 阅读 · 0 评论 -
【Leetcode 514】自由之路 —— 动态规划
我们可以使用**动态规划**解决本题,解题思路:1. 状态定义:`dp[i][j]` 表示 key 的第 i 个字符, ring 的第 j 个字符与 12:00 方向对齐的最少步数;`pos[i]` 表示字符 i 在 ring 中出现的位置集合,用来加速计算转移的过程 2. 状态转移方程:枚举上一次与`12:00`方向对齐的位置`k`,此次需要从位置`k`旋转到位置`j`原创 2024-02-01 11:05:08 · 987 阅读 · 1 评论 -
【Leetcode 134】加油站 —— 贪心法
贪心算法是一种基于贪心策略的算法设计方法,用于在求解最优化问题时作出一系列局部最优选择,从而达到全局最优的目标。如果总差值小于零,说明总油量不够行驶一周。如果总差值大于等于零,**因只存在唯一解**,油量最紧缺即为旅程的最后一站,下一站即为所求的起点站原创 2024-01-31 16:07:16 · 931 阅读 · 0 评论 -
【Leetcode 198】打家劫舍 —— 动态规划
我们可以使用**动态规划**解决本题,解题思路:1. 状态定义:`dp[i]`为前 i 间房屋能偷窃到的最高总金额2. 状态转移方程:枚举 x,不偷窃第x间房屋,则总金额为 偷窃前x - 1间的最高总金额;偷窃第x间,则总金额为 偷窃前x - 2间最高总金额 + 第x间的金额 dp[i] = max(dp[i - 1], dp[i - 2] +nums[i])原创 2024-01-31 10:13:56 · 882 阅读 · 0 评论 -
【Leetcode 670】最大交换 —— 贪心法
将数字转为字符数组,依次从头找到不为9的数字,将其与低位数字最大值交换(最大值有多个时,选择最低位的数字)原创 2024-01-30 14:49:12 · 458 阅读 · 0 评论 -
【Leetcode 2680】最大或值 —— 贪心法|前缀和
1. 选最高位1的数更优 2. 最高位1可能有多个数, 选择其中一个操作一次后, 满足结论1只需将k次操作都交给同一个数, 得出结果为最大值预处理前后缀和,当`0原创 2024-01-29 15:31:07 · 482 阅读 · 0 评论 -
【Leetcode 410】分割数组的最大值 —— 动态规划
我们可以使用**动态规划**解决本题,解题思路:1. 状态定义:`f[i][j]` 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值;`sub(i,j)`表示数组 `nums`中下标落在区间`[i,j]`内的数的和2. 状态转移方程:枚举 x,其中前 x 个数被分割为 j−1 段,而第 x+1 到第 i 个数为第 j 段原创 2024-01-29 10:32:59 · 1224 阅读 · 0 评论 -
【Leetcode 22】括号生成 —— 回溯法
解题思路:排列树,按节点遍历1. 回溯结束条件:左括号数 = 右括号数 = 总数2. 左括号数原创 2024-01-18 14:38:02 · 485 阅读 · 0 评论 -
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可原创 2024-01-17 15:30:22 · 474 阅读 · 0 评论 -
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离原创 2024-01-16 16:07:44 · 472 阅读 · 0 评论 -
【Leetcode 2645】构造有效字符串的最小插入数 —— 动态规划
状态定义:`d[i]`为将前 i 个字符拼凑成若干个 abc 所需要的最小插入数。状态转移方程:如果` word[i]>word[i−1]`,那么`word[i]`可以和`word[i−1]`在同一组 abc 中,`d[i]=d[i−1]−1`;否则`word[i]`单独存在于一组 abc 中,`d[i]=d[i−1]+2`原创 2024-01-16 11:39:20 · 425 阅读 · 0 评论 -
【Leetcode 78】子集 —— 回溯法
回溯法解题步骤:1. 针对所给问题,定义问题的解空间;2. 确定易于搜索的解空间结构;3. 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索原创 2024-01-15 16:30:00 · 484 阅读 · 0 评论 -
【Leetcode 程序员面试金典 02.04】 —— 分割链表|双指针
可以使用双指针解决本题,定义两个链表 small 和 big 即可,small 链表按顺序存储所有小于 x 的节点,big 链表按顺序存储所有大于等于 x 的节点。遍历完原链表后,我们只要将 small 链表尾节点指向 big 链表的头节点即能完成对链表的分割原创 2024-01-11 09:54:52 · 475 阅读 · 0 评论 -
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;而在位运算中,1L原创 2024-01-10 10:39:48 · 464 阅读 · 0 评论 -
【Leetcode 2707】字符串中的额外字符 —— 动态规划
1. 状态定义:把`s[i−1]`当做是额外字符,`d[i] = d[i−1] + 1`2. 状态转移方程:遍历所有的`j(j∈[0,i−1])`,如果子字符串`s[j...i−1]`存在于`dictionary`中,那么`d[i] = min d[j]3. 初始状态`d[0] = 0`,最终答案为`d[n]`原创 2024-01-10 15:30:00 · 554 阅读 · 0 评论