
LeetCode - Hot100
文章平均质量分 75
描绘一抹色
这个作者很懒,什么都没留下…
展开
-
力扣-hot100(搜索二维矩阵)
二分查找,题目强调有序数据,天然的符合二分条件,常规的二分就是取中间点, 然后观察这个点的值与目标值比较是大了还是小了。而这里二维二分,基本思路一样,初始取整个数组的中间坐标,根据得到的点不断更新 x,y 即可。输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5。每列的所有元素从上到下升序排列。每行的元素从左到右升序排列。每列的元素从上到下升序排列。原创 2025-05-07 14:04:18 · 378 阅读 · 0 评论 -
力扣-hot100(旋转图像)
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。// 再按对角线翻转。使用另一个矩阵来旋转图像。原创 2025-05-07 13:50:27 · 457 阅读 · 0 评论 -
力扣-hot100(螺旋矩阵)
模拟: 第一个周期:行的第一行,列的倒数第一列,行的倒数第一行,列的第一列;第二个周期:行的第二行,列的倒数第二列,行的倒数第二行,列的第二列.....输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]// 从右到左遍历底部行。// 从下到上遍历左侧列。// 从左到右遍历顶部行。输出:[1,2,3,6,9,8,7,4,5]原创 2025-05-07 13:47:37 · 788 阅读 · 0 评论 -
力扣-hot100 (矩阵置零)
/ 为了不破坏原来的结构, 就是被感染成 0 的不能再去感染别的数, 只有初始为0的数才能去感染其它数。// 可进行优化, 因为这里只要把行和列的下标索引记录下来就可以了。输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]输出:[[1,0,1],[0,0,0],[1,0,1]]的矩阵,如果一个元素为。原创 2025-05-06 17:14:54 · 1500 阅读 · 0 评论 -
力扣-hot100 (缺失的第一个正数)
这里将每个遍历到的值都将数组的索引做一个标记 (为了不影响这个数本身的价值,将其标为负数, 用到该数时再取绝对值, 但如果这里原来数组的数本来就是负数呢?这里是要找缺失的第一个正数,负数是没有价值的, 所以我们可以将初始就为负数的数替换为一个特定的数. 为了不影响结果, 这个特定的数是要保证是存在的, 所以我们可以将其替换为 1 ~ n+1 的任何数, 只要在预处理的时候检查他存在, 但题目要求的是需要第一个正数, 故如果选择后面的数会出现漏掉前面较小的数的检查. 所以最小数1是你的不二选择)。原创 2025-05-06 16:51:18 · 1108 阅读 · 0 评论 -
力扣hot100 (除自身以外数组的乘积)
常规做法是可以开两个数组left[nums.size]、right[nums.size]记录.但仔细观察后可以发现这里每个元素的左右侧乘积是连续的. 也就是第i个元素的左乘积 = 第 i - 1 元素的左乘积 * 第 i - 1个元素, 可使用一个变量记录上一个元素的左乘积得到. 同理可以计算右乘积。// 第i个元素的左乘积 = 第 i - 1 元素的左乘积 * 第 i - 1 个元素。输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]// 先将所有元素的左乘积给计算出来。原创 2025-05-05 20:37:26 · 637 阅读 · 0 评论 -
力扣hot100 (轮转数组)
输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]// 计算第i个元素存放的位置。原创 2025-05-05 19:47:36 · 309 阅读 · 0 评论 -
力扣hot100 - 合并区间
如果小于则 可以进行区间合并 进行第 i - 1 的右区间进行更新 否则开一个加入一个新的区间。输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。// 如果新加入队列的元素 <= 当前队列中的最后一个元素 -> 则可以进行合并。// 更新其右端点后加入到队列中, 更新的值应该是两个区间右端点的最大值。// 不能合并的情况, 直接将新的元素加入队列中。// 拿到队列中最后一个元素。执行用时分布 7ms 击败 88.71%原创 2025-05-05 19:15:22 · 460 阅读 · 0 评论 -
力扣-hot100(和为k的子数组)
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。输入:nums = [1,2,3], k = 3 输出:2。子数组是数组中元素的连续非空序列。原创 2025-04-25 11:23:25 · 235 阅读 · 0 评论 -
力扣-hot100(找到字符串中的所有字母异位词)
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。解法一:暴力统计,每次取出s的p.length()个字符从头到位遍历,然后进行排序,观察是否和p排序后一样。438. 找到字符串中所有字母异位词。原创 2025-04-25 11:22:18 · 264 阅读 · 0 评论 -
力扣-hot100(滑动窗口最大值)
里面的数据如:13、11、9、5、1、0。// 公司还有员工的情况下,发现了一个新加入的员工,他不仅年轻(靠后),能力还更强(数更大), 那就从kpi低的老员工开始优化。// 如果员工的数量已经可以评出优秀员工了,就选出第一名(其实就是第 i == k - 1 后开始的, 因为i的下标从0开始)输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值。// 观察了新员工的简历,先把能力比新员工低的老员工优化了(也就是后面的)原创 2025-04-25 11:19:51 · 934 阅读 · 0 评论 -
力扣-hot100(无重复字符的最长子串)
维护一个队列,每次往队列中加入元素,就去看看队列中是否有一个相同的元素已经在里面了,如果有,就把元素从前往后进行结算,再将该元素加入队列中,以此类推,得到最长子串.解法二: 用Set来维护这些元素(set.contains(c)的时间复杂度为O(1)),那怎么保留队列的性质呢?我们只需要在加入元素的时候一直加加加,加到厌倦(出现了重复元素),然后移除的时候只需要移除掉那个重复元素就行。// 除了第一次加入元素外,其它都是上一轮加到重复了才会停止,所以将上一个字符移除。// 判断队列中是否存在这么一个元素。原创 2025-04-19 19:53:54 · 931 阅读 · 0 评论 -
力扣-hot100(接雨水-双指针)
思路:双指针分别指向两侧,不断向中间靠近,如果靠近的过程中右边最长的柱子长度 大于 左边最长的柱子长度,短板效应,那么就可以计算左边当前的空穴可以装多少水了【是由左边最长的柱子和左边当前柱子的长度差决定的(leftMax - height[left])】输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。原创 2025-04-19 11:21:55 · 375 阅读 · 0 评论 -
力扣-hot100(三数之和-双指针)
/ 去重:只对能组成三元组的去重, 这里不能出现重复的三元组,如果类似于nums[l] 和nums[l + 1] 是相同的话,那就是确定了两个数(nums[i] 和 nums[l]都确定了),第三数也会被随之确定下来。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]注意,输出的顺序和三元组的顺序并不重要。输入:nums = [0,1,1]输入:nums = [0,0,0]输出:[[0,0,0]]原创 2025-04-16 14:27:29 · 798 阅读 · 0 评论 -
力扣-hot100(盛最多水的容器-双指针)
补充: 这样做会不会漏掉,这里漏掉的情况只可能有一种,就是当两个高相等时,移动了随机一根,但是要明确的是高的长度是由最短的那根确定下来的,即便你后面有很长的,也会被这两根相同的限制,所以不论移动哪根都是一样的。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。容器的长是由两直线(宽)的距离决定的,容器的高是两直线中最短的那根确定的。实事上并不是每条边(高)都是有价值的,宽的价值是很好确定的,最两侧的边,为宽的最大权重。// 容器的长是由两直线的距离决定的,容器的高是两直线中最短的那根。原创 2025-04-16 13:56:25 · 943 阅读 · 0 评论 -
力扣-hot100(移动零-双指针)
/right不断往后扩展找到不为0的数与前面的数交换,与哪个位置的数交换呢?,上述代码是找到不为0的数往前移动,然后在最后补零。依据题目可以看到是要把某个固定的元素给往后移动,既然如此,我们就可以把那个固定的元素保存下来,再把其它元素往前移动,然后最后的n个固定元素可以直接补齐。// right为快指针,目的是找到不为0的数,将其往左移动,left负责记录下不为0的数的个数。移动到数组的末尾,同时保持非零元素的相对顺序。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]原创 2025-04-16 13:39:00 · 371 阅读 · 0 评论 -
力扣-hot100(最长连续序列 - Hash)
那么我可以将数组中的分为 n 个组,毕竟组是相对有序的,比直接在乱七八糟的原数组里直接做要来的方便。一旦断了,那断的那个数你就自己做队长去招募你的队员吧。我们只需要从队长开始不断的报数就可以统计该组的元素数量,然后求每个组的max就行了。第一想法,先预处理一波,可以创建一个数组把存在的数都标记一遍,如:nums = [100,4,200],标记:number[100] = 1, number[4] = 1, number[200] = 1;,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。原创 2025-04-15 16:04:02 · 719 阅读 · 0 评论 -
力扣 - Hot100 (字母异位词分组 - Hash)
题目要求按异位词来分组,也就是只要组成单词的字母完全相同,就可以被称为一个组,他们就应该有同样的唯一性标识可以进入同一个组,也就是要有同样的key。而题目中的成员是String类型,这就很容易了,让每个String排个序,同一组的异位词不就可以等到同样的结果吗。有没有这样一种数据结构可以维护n个不同的组,并且能检测每个想加入的成员的唯一性标识来决定给你分配到哪个组 (不然每个元素都可以加入任意组那我分组的意义在哪?// 加入失败,您加入的组不存在。// 维护n个组,每个组互为字母异位词。原创 2025-04-14 21:09:03 · 1310 阅读 · 0 评论 -
力扣-hot100(两数之和 - Hash)
优化,想法:如果这是一个有序的数组那么就,只需要用双指针指向两边逐渐向中间靠拢,则遍历n次就可保证得到。答:这里的核心在于,对于数组中的每个元素 num,需要快速判断数组里是否存在另一个元素 target - num,并且要知道它们各自的索引。:有没有一个结构能将前面遍历过的数都存储起来,往后遍历时只需要用目标值减去当前遍历到的值,然后判断之前是否有存储过这么一个值(有的 兄弟有的)。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。原创 2025-04-13 13:28:50 · 891 阅读 · 0 评论