LeetCode刷题笔记
文章平均质量分 83
LeetCode刷题笔记
程序员阿甘
这个作者很懒,什么都没留下…
展开
-
LeetCode - 850 矩形面积 II
虽然矩形交集很容易求解,但是想要求出所有交集,则需要让每个矩形和剩余其他矩形尝试比较,得出交集。对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。上面这种思路就是 ”扫描线算法“,扫描线法可以将 "面" 的问题,分解为 "线" 的问题,将 "矩形(面)交集问题" 降解为 "区间(线)交集问题"。从(1,1)到(2,2),绿色矩形和红色矩形重叠。原创 2024-09-27 00:07:40 · 990 阅读 · 0 评论 -
LeetCode - 503 下一个更大元素 II
本题相较于 496题 的变化在于,nums 数组是首尾相连的,即 nums[nums.length - 1] 下一个更大元素,可以继续从 nums[0] 开始找。给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。输入: nums = [1,2,3,4,3]原创 2024-09-25 15:25:47 · 481 阅读 · 0 评论 -
LeetCode - 496 下一个更大元素 I
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素。- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1。- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。输入:nums1 = [4,1,2], nums2 = [1,3,4,2].输入:nums1 = [2,4], nums2 = [1,2,3,4].原创 2024-09-25 14:31:36 · 661 阅读 · 0 评论 -
LeetCode - 17 电话号码的字母组合
因此 "23" 对应的组合有:"ad"、"ae"、"af"、"bd"、"be"、"bf"、"cd"、"ce"、"cf"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]因此,如果我们可以遍历出该树形结构的每一条分支,那么就能求出所有组合。如果画图表示的话,可以发现组合问题的求解过程,可以形成一个树形结构。该树形结构的每一条根到叶子节点的路径都对应一个组合。本题是一个组合问题,可以使用回溯算法解题。输出:["a","b","c"]输入:digits = "2"原创 2024-09-11 16:32:55 · 743 阅读 · 0 评论 -
LeetCode - 16 最接近的三数之和
本题要求的是最接近taget的三数之和,因此我们在找三元组的过程中,只要保留和target差距最小的三元组之和即可。解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。输入:nums = [-1,2,1,-4], target = 1。输入:nums = [0,0,0], target = 1。一致,具体逻辑,可以看下这篇博客。中选出三个整数,使它们的和与。假定每组输入只存在恰好一个解。原创 2024-09-10 14:39:48 · 531 阅读 · 0 评论 -
LeetCode - 15 三数之和
因此当 nums[i] == nums[i-1] 时,我们就可以跳过 nums[i] 产生三元组的过程,因为必然和 nums[i-1] 产生的三元组发生重复。我们返回的结果是一个 int** 类型的,主要记录不重复的三元组,比如 [[-1,-1,2], [-1,0,1]],可以发现返回值本质是一个二维数组。比如对于返回值 [[-1,-1,2], [-1,0,1]] 来说,returnSize = 2,returnColumnSizes = [3, 3]输出:[[-1,-1,2],[-1,0,1]]原创 2024-09-09 20:30:56 · 1141 阅读 · 0 评论 -
LeetCode - 14 最长公共前缀
我们可以假设最长公共前缀 prefix = strs[0],然后遍历其余 strs[i] 和 prefix 取最长公共前缀后,更新 prefix。输入:strs = ["flower","flow","flight"]输入:strs = ["dog","racecar","car"]编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。解释:输入不存在公共前缀。原创 2024-09-01 18:38:26 · 358 阅读 · 0 评论 -
LeetCode - 13 罗马数字转整数
通常情况下,罗马数字中小的数字在大的数字的右边。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。例如, 罗马数字 2 写做 II ,即为两个并列的 1。解释: M = 1000, CM = 900, XC = 90, IV = 4.罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。输入: s = "MCMXCIV"情况1,每个罗马数字都是独立的。输入: s = "LVIII"输入: s = "III"输入: s = "IV"输入: s = "IX"原创 2024-09-01 17:56:00 · 752 阅读 · 0 评论 -
LeetCode - 12 整数转罗马数字
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)700 = DCC 由于 500 (D) + 100 (C) + 100 (C)首先,我们需要配置: 阿拉伯数字 和 罗马数字 的映射表。注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位。40 = XL 由于 50 (L) 减 10 (X)9 = IX 由于 10 (X) 减 1 (I)这里我的策略是定义两个数组:nums 和 romans。原创 2024-09-01 13:41:25 · 967 阅读 · 0 评论 -
LeetCode - 11 盛最多水的容器
也就是说 h[R1] * (R1 - L1 + 1) 的结果是肯定大于 h[L] * (R - L + 1) 的,因此这里 L 虽然没有匹配到最优高柱 R1,但是 R1 作为矮柱时的容器肯定比当前 R1 作为高柱时的容器盛水更多。容器内水的容量大小 V,取决于容器两端中的较短柱子h_min,因此为了使得容器内水尽可能的多,我们应该找到距离 h_min 柱子最远的,且高度>= h_min 的另一个柱子。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。输入:height = [1,1]原创 2024-09-01 12:42:28 · 837 阅读 · 0 评论 -
LeetCode - 10 正则表达式匹配
所谓动态规划,即递推,从简单易解的小问题的结果,逐步递推出,复杂难解的大问题的结果。原创 2024-09-01 00:38:11 · 1618 阅读 · 0 评论 -
LeetCode - 9 回文数
回文数的特点是正序和倒序都一样,比如整数 121 的倒序也是 121,因此 121 是回文数。给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。解释:从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。解释:从右向左读, 为 01。例如,121 是回文,而 123 不是。注意:按照题目要求,本题负数都不是回文数。输入:x = -121。输入:x = 121。原创 2024-08-30 22:58:17 · 25329 阅读 · 0 评论 -
LeetCode - 8 字符串转换整数 (atoi)
第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')第 3 步:"0-1" (读入 "0";第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')第 2 步:" -042"(读入 '-' 字符,所以结果应该是负数)第 3 步:" -042"(读入 "042",在结果中忽略前导零)第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)原创 2024-08-30 13:46:30 · 1390 阅读 · 0 评论 -
LeetCode - 7 整数反转
需要注意的是,本题的 x 虽然取值范围限制在了 int 范围内,但是 x 反转后的数值是可能超出 int 范围的,但是不会超出 long 范围,因此反转后的数 res 我们应该使用 long 来记录。但是需要注意的是:(1 << 31) 的结果居然是负数?比如我们表示 2^31 - 1,可能会使用 pow(2, 31) - 1,或者 (1 << 31) - 1。给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。还有一点,本题暴露了python的一个问题,那就是 python 的。原创 2024-08-30 00:36:27 · 693 阅读 · 0 评论 -
LeetCode - 6 Z 字形变换
本题,我们可以定义一个长度 numRows 的字符串数组,对应于结果排列的各行。之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。无论直边的填充,还是斜边的填充,填充顺序都是固定的,即字符串 s 的遍历顺序。输入:s = "PAYPALISHIRING", numRows = 3。输入:s = "PAYPALISHIRING", numRows = 4。输入:s = "A", numRows = 1。输出:"PAHNAPLSIIGYIR"原创 2024-08-29 23:01:06 · 1115 阅读 · 0 评论 -
LeetCode - 5 最长回文子串
基于最简回文子串,我们向其两端扩展,比如最简回文子串的范围是 s[i],那么可以定义 L = i , R = i,只要 s[L] == s[R],则回文子串扩展成功,新的回文子串范围是 s[L, R],然后按此逻辑继续扩展 L--,R++,直到发现 s[L]!同理,比如最简回文子串时 s[i, i+1],那么可以定义 L = i ,R = i + 1,只要 s[L] == s[R],则回文子串扩展成功,新的回文子串范围是 s[L, R],然后按此逻辑继续扩展 L--,R++,直到发现 s[L]!原创 2024-08-29 19:37:03 · 504 阅读 · 0 评论 -
LeetCode - 4 寻找两个正序数组的中位数
题目来源4. 寻找两个正序数组的中位数 - 力扣(LeetCode)题目描述给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。示例 1输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2输入:nums1 = [1,2], nums2 = [3,4]原创 2024-08-29 19:35:47 · 759 阅读 · 0 评论 -
LeetCode - 3 无重复字符的最长子串
为什么是128长度的数组呢?即定义两个指针 L,R,初始时 L,R 都初始化为0,表示 s 串的 [L, R)区间为一个滑动窗口。这里我们可以定义一个128长度的数组index,或者一个哈希表来记录 R 指针扫描过的字符及其出现的索引位置。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。原创 2024-08-29 19:34:59 · 1001 阅读 · 0 评论 -
LeetCode - 2 两数相加
给你两个 非空 的链表,表示两个非负的整数。为了代码简单,我们可以总是保证 l1 是较长链表(如果 l1 是较短的,则互换 l1 和 l2)。首先:判断出 l1 和 l2 两个链表哪个长,我们以较长的链表作为基础,即将较短的链表。输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输入:l1 = [2,4,3], l2 = [5,6,4]输入:l1 = [0], l2 = [0]输出:[8,9,9,9,0,0,0,1]较长的链表中,避免创建新链表。输出:[7,0,8]原创 2024-08-29 19:33:41 · 965 阅读 · 0 评论 -
LeetCode - 1 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。你可以按任意顺序返回答案。原创 2024-08-29 19:32:47 · 755 阅读 · 0 评论