
力扣
文章平均质量分 64
刷力扣题的成长过程
德先生&&赛先生
民主和科学,一位普普通通的c++程序员
展开
-
LeetCode-51. N 皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。的棋盘上,并且使皇后彼此之间不能相互攻击。如上图所示,4 皇后问题存在两个不同的解法。行差绝对值必定与列差绝对值相等。的棋子放置方案,该方案中。每一种解法包含一个不同的。分别代表了皇后和空位。原创 2025-05-01 22:35:46 · 334 阅读 · 0 评论 -
LeetCode-79. 单词搜索
这样,当回到上一层递归或主循环的外层循环时,网格状态已被还原为原始输入。因此,后续的 DFS 调用(如另一个起点或另一条路径)可以正常访问该单元格。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。)会逐个尝试网格中的每个点作为起点。由于每次 DFS 结束后都进行了回溯,每个起点的尝试是。每次 DFS 探索失败后,函数退出前会恢复单元格的值(你可以使用搜索剪枝的技术来优化解决方案,使其在。主函数中的双层循环(原创 2025-04-29 22:21:08 · 344 阅读 · 0 评论 -
LeetCode-47. 全排列 II
给定一个可包含重复数字的序列。返回所有不重复的全排列。原创 2025-04-23 15:26:58 · 208 阅读 · 0 评论 -
LeetCode-417. 太平洋大西洋水流问题
当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。这个岛被分割成一个由若干方形单元格组成的网格。岛上雨水较多,如果相邻单元格的高度。处于大陆的左边界和上边界,而。处于大陆的右边界和下边界。原创 2025-04-23 14:12:46 · 362 阅读 · 0 评论 -
LeetCode-46. 全排列
全排列问题要求生成所有可能的元素排列。回溯法是一种有效的解决方法,其核心思想是通过递归和回溯来探索所有可能的路径。给定一个不含重复数字的数组。原创 2025-04-23 15:01:05 · 369 阅读 · 0 评论 -
LeetCode-547. 省份数量
是一组直接或间接相连的城市,组内不含其他没有相连的城市。个城市,其中一些彼此相连,另一些没有相连。表示二者不直接相连。原创 2025-04-02 14:54:41 · 366 阅读 · 0 评论 -
LeetCode-695. 岛屿的最大面积
答案不应该是 11,因为岛屿只能包含水平或垂直这四个方向上的 1。(代表土地) 构成的组合,这里的「相邻」要求两个。如果没有岛屿,则返回面积为。岛屿的面积是岛上值为。原创 2025-03-31 08:49:37 · 319 阅读 · 0 评论 -
LeetCode-75. 颜色分类
为了解决颜色排序问题,我们可以使用荷兰国旗问题的三指针法。该方法通过一次遍历数组,将元素分为三个部分:红色(0)、白色(1)和蓝色(2)。对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。必须在不使用库内置的 sort 函数的情况下解决这个问题。给定一个包含红色、白色和蓝色、共。分别表示红色、白色和蓝色。原创 2025-03-26 15:19:33 · 329 阅读 · 0 评论 -
LeetCode-451. 根据字符出现频率排序
要解决这个问题,我们需要根据字符出现的频率对字符串进行降序排序,同时相同字符必须连续出现。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意"cacaca"是不正确的,因为相同的字母必须放在一起。'e'出现两次,'r'和't'都只出现一次。注意'A'和'a'被认为是两种不同的字符。如果有多个答案,返回其中任何一个。是它出现在字符串中的次数。原创 2025-03-26 14:59:58 · 300 阅读 · 0 评论 -
LeetCode-347. 前 K 个高频元素
include <cstdlib> // 用于 rand() 函数#include <unordered_map> // 用于哈希表统计频率#include <vector> // 用于动态数组存储元素public:// 阶段1: 统计每个数字的出现频率// 哈希表存储(数字,出现次数)// 遍历数组统计频率,O(n)时间复杂度// 阶段2: 准备可排序的数据结构// 存储格式(数字,频率)// 将哈希表项转为可排序的vector// 阶段3: 定义降序比较规则。原创 2025-03-25 11:45:54 · 442 阅读 · 0 评论 -
LeetCode-215. 数组中的第K个最大元素
这道题的难度很高,我最开始是采用普通的快速选择,虽然答案是对的,但是会超时,然后问了下AI,才知道该用。,但我也是看了很久才看懂的,接下来我会挑一些重点的给你们讲讲、也就是将数组分为。),有效避免输入数据有序导致的 O(n²) 最坏时间复杂度。区间随机选取一个元素作为基准值,确保算法鲁棒性。请注意,你需要找的是数组排序后的第。三个区间,不过需要注意一下开闭区间。你必须设计并实现时间复杂度为。个最大的元素,而不是第。每次随机选择基准值 (初始处理整个数组 (原创 2025-03-24 09:36:28 · 421 阅读 · 0 评论 -
LeetCode-540. 有序数组中的单一元素
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。,从而排除了可能包含单独元素的中间位置。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足。,以确保搜索范围包含当前。原创 2025-03-04 10:11:23 · 319 阅读 · 0 评论 -
LeetCode-154. 寻找旋转排序数组中的最小值 II
它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。循环的目的是逐步缩小查找范围,直到找到最小值。你必须尽可能减少整个过程的操作步骤。的数组,预先按照升序排列,经由。分别指向数组的起始和末尾。原创 2025-03-02 10:52:08 · 329 阅读 · 0 评论 -
LeetCode-81. 搜索旋转排序数组 II
请你编写一个函数来判断给定的目标值是否存在于数组中。已知存在一个按非降序排列的整数数组。你必须尽可能减少整个操作步骤。,数组中的值不必互不相同。在预先未知的某个下标。原创 2025-03-02 10:22:47 · 280 阅读 · 0 评论 -
LeetCode-69. x 的平方根
8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。我们可以把这道题想象成,给定一个非负整数。不允许使用任何内置指数函数和算符,例如。由于返回类型是整数,结果只保留。在定义域上是单调递增的。原创 2025-02-24 19:41:06 · 288 阅读 · 0 评论 -
LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置
为了满足时间复杂度 O(logn) 的要求,我们需要分别对这两个位置进行两次独立的二分查找。请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。原创 2025-02-24 21:01:12 · 491 阅读 · 0 评论 -
LeetCode-524. 通过删除字母匹配到字典里最长单词
这是一个双指针的问题,双指针应用在哪呢?就是用在辅助函数里,来判断某个字符串是否是另一个字符串的子序列,具体方法是使用双指针,分别遍历。因为前面已经将字典进行排序,而且字典优先按长度降序排列,如果长度相同则按字典序升序排列。也就是说,第一个找到的字符串就是最符合要求的答案。为了方便比较长度和字典序,可以先对字典进行排序:优先按长度降序排列,如果长度相同则按字典序升序排列。如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。中最长的字符串,该字符串可以通过删除。原创 2025-02-20 21:50:15 · 686 阅读 · 0 评论 -
LeetCode-633. 平方数之和
你要判断是否存在两个整数。原创 2025-02-17 21:03:57 · 496 阅读 · 0 评论 -
LeetCode-680. 验证回文串 II
给你一个字符串 ,最多 可以从中删除一个字符。请你判断 是否能成为回文字符串:如果能,返回 ;否则,返回 。示例 1:输入:s = "aba"输出:true示例 2:输入:s = "abca"输出:true解释:你可以删除字符 'c' 。示例 3:输入:s = "abc"输出:false提示:3、解题思路 回文的定义 :双指针法 :辅助函数 :原创 2025-02-17 21:32:03 · 240 阅读 · 0 评论 -
LeetCode-76.最小覆盖子串
,更新start 、len的值,然后 char d = s [left++],当 need.count(d) 时,--window[d],当 window[d] == need[d]时,也就是不需要再收缩了,--valid,退出循环。,++window[c] ,如果 need[c] == window[c] 时,代表window 已经包含 need 里面的所有 c 字符了,那么 ++valid,也就是说,某个字符,已经完全满足。t 中两个字符 'a' 均应包含在 s 的子串中,原创 2025-02-17 18:34:41 · 348 阅读 · 0 评论 -
LeetCode-88. 合并两个有序数组
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。因为这两个数组已经排好序,我们可以把两个指针分别放在两个数组的末尾,即 nums1。的数字已经复制完,剩余 nums1 的数字不需要改变,因为它们已经被排好序。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。需要合并 [1,2,3] 和 [2,5,6]。的末尾,所以我们还需要第三个指针,以便复制。需要合并的数组是 [] 和 [1]。中,使合并后的数组同样按。原创 2025-02-09 18:49:01 · 245 阅读 · 0 评论 -
LeetCode-167. 两数之和 II - 输入有序数组
因此 index1 = 1, index2 = 2。因为数组已经排好序,我们可以采用方向相反的双指针来寻找这两个数字,一个初始指向最。如果两个指针指向元素的和等于给定值,那么它们就是我们要的结果。小的元素,即数组最左边,向右遍历;一个初始指向最大的元素,即数组最右边,向左遍历。对于排好序且有解的数组,双指针一定能遍历到最优解。此时两个指针指向值的和小于给定值,因此左指针会一直右移直到到达。此时两个指针指向值的和大于给定值,因此右指针会一直左移直到到达。好序且有解的数组,双指针一定能遍历到最优解。原创 2025-02-09 18:10:19 · 232 阅读 · 0 评论 -
LeetCode-406. 根据身高重建队列
因为高的人不会影响后面插入的矮的人的位置,或者说矮的人插入时,已经排好的高的人的数量就是他们前面可能的高的人数。当后面有比他矮的人时,他们的ki值决定了前面有多少比他高的,这时候插入到对应的位置就不会影响到已经排好的高个子的顺序。由于已经处理的人的身高都大于或等于当前处理的人,插入到k值的位置时,前面正好有k个满足条件的人。编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。原创 2025-02-08 14:20:19 · 584 阅读 · 0 评论 -
LeetCode-665. 非递减数列
最后,在每次遇到递减情况并进行调整后,需要记录修改的次数。如果修改次数超过 1 次,说明无法在最多改变 1 个元素的情况下使数组变成非递减数列,直接返回。刚开始写这题时,我还在嘲笑这道题配不上中等的难度,直到我第一次写完提交之后才发现原来自己是个小丑,我的第一个代码主要存在这样一个逻辑错误,当。,说明出现了递减的情况,此时需要对元素进行调整,同时记录调整的次数。,这种做法没有考虑到修改元素后可能会破坏前面已经满足的非递减条件。个元素的情况下,该数组能否变成一个非递减数列。,按照你的代码逻辑,会将。原创 2025-02-08 15:13:25 · 370 阅读 · 0 评论 -
LeetCode-122.买卖股票的最佳时机 II
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。原创 2025-02-07 21:39:15 · 252 阅读 · 0 评论 -
LeetCode-763.划分字母区间
每个字母只能在其中一个片段出现,所以对于每个字符来说,它的最后一次出现的位置决定了所在片段的终点至少得在哪里。比如,假设有一个字符a,它在字符串中最后一次出现的位置是 i,那么包含a的片段必须至少延伸到 i 的位置,否则后面的a就会被分割到另一个片段,这样就不符合条件了。然后,遍历字符串,维护当前片段的起始和结束位置。当遍历到当前结束位置的时候,就可以确定一个片段的长度,并开始下一个片段。3. 对于每个遍历到的字符s[i],查看它的最后出现位置,如果这个位置比当前的end大,就更新end为这个位置。原创 2025-02-07 21:08:56 · 339 阅读 · 0 评论 -
LeetCode-452.用最少数量的箭引爆气球
比如,按照区间的结束点排序,然后每次尽可能选结束最早的,这样可以给后面的区间留下更多的空间。比如,第一个区间的结束点,如果后面的区间的开始点在这个结束点之前,那么它们可以被同一支箭射中。当遇到一个区间的开始点大于当前组的结束点时,就需要新增一支箭,并更新当前组的结束点为该区间的结束点。那这里的思路可能是找出有多少个不重叠的区间,或者说尽可能多的重叠区间,这样可以用最少的箭。那问题转化为,如何将这些区间分成尽可能少的组,每组内的所有区间都有一个共同的交点。那我们的目标就是用最少的箭,覆盖所有区间。原创 2025-02-07 20:07:53 · 888 阅读 · 0 评论 -
LeetCode-435.无重叠区间
在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区。在样例中,排序后的数组为 [[1,2], [1,3], [2,4]]你需要移除两个 [1,2] 来使剩下的区间没有重叠。你不需要移除任何区间,因为它们已经是无重叠的了。需要移除区间的最小数量,使剩余区间互不重叠。移除 [1,3] 后,剩下的区间没有重叠。择的区间不重叠的区间。原创 2025-02-07 13:24:35 · 374 阅读 · 0 评论 -
LeetCode-605.种花问题
朵花,核心是算出花坛里能额外种花的空位数量。我们通过遍历花坛数组,依据 “花不能相邻” 规则,检查每个空位能否种花,统计可种花的空位总数,再和。假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。依次查看每个位置,判断能否种花。对于数组首尾位置,特殊处理,首位置只需右侧为。要判断能否在花坛里按规则种入。若某位置满足条件,将其标记为已种花(置为。,能否在不打破种植规则的情况下种入。,且左右相邻位置(若存在)也为。中不存在相邻的两朵花。原创 2025-02-07 14:09:43 · 285 阅读 · 0 评论 -
LeetCode-135.分发糖果
1.虽然这一道题也是运用贪心策略,但我们不需要排序和选择,只需要简单的两次遍历即可:把所有孩子的糖果数初始化为 1;如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。原创 2025-02-06 15:43:46 · 272 阅读 · 0 评论 -
LeetCode-455.分发饼干
2.简而言之,这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。以满足饥饿度更大的孩子,所以我们应该把大于等于这个孩子饥饿度的、且大小最小的饼干给这。满足了这个孩子之后,我们采取同样的策略,考虑剩下孩子里饥饿度最小的孩子,直到。虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。原创 2025-02-06 14:32:21 · 282 阅读 · 0 评论 -
LeetCode-107.二叉树的层序遍历II
(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)原创 2024-05-02 20:53:54 · 55 阅读 · 0 评论 -
LeetCode-226. 翻转二叉树
力扣226原创 2024-05-02 20:01:34 · 32 阅读 · 0 评论