- 博客(50)
- 收藏
- 关注
原创 69. x 的平方根
要计算非负整数 x 的算术平方根并返回整数部分,可以使用二分查找法。核心思想是在可能的范围内(0 到 x)找到最大的整数 mid,使得 mid² ≤ x。通过不断缩小搜索范围,最终得到结果。:左边界 left 设为 0,右边界 right 设为 x。比较 mid² 与 x 的大小,调整边界以缩小范围。:循环结束时,right 即为所求的整数平方根。:O(log x),二分查找每次将范围缩小一半。不允许使用任何内置指数函数和算符,例如。由于返回类型是整数,结果只保留。:O(1),仅使用常数空间。
2025-04-17 21:20:49
208
原创 67. 二进制求和
O(max(M, N)),其中 M 和 N 分别为字符串 a 和 b 的长度。需要遍历两个字符串的全部位数。:O(max(M, N)),存储结果的字符串长度最多为 max(M, N) + 1(进位情况):计算结果按低位到高位顺序生成,需反转得到最终结果。:每位相加结果可能产生进位,需保存至下一位计算。:当两字符串长度不同时,短字符串高位视为0。,以二进制字符串的形式返回它们的和。:二进制加法从最低位(右端)开始计算。给你两个二进制字符串。
2025-04-17 20:56:06
76
原创 40. 组合总和 II
索引,确保在递归中不会重复选择已经选过的数字。同时,为了防止相同组合出现,我们在递归过程中要跳过重复的数字。: 我们使用递归来探索所有可能的组合。在每次递归时,选择当前数字,并将目标。减为 0,说明找到了一组解,将其加入结果列表;否则继续递归寻找下一个数字。在每一层递归中,为了保证每个数字只使用一次,我们通过维护一个。,则无需继续递归,因为数组是排序的,后续数字只会更大。数组进行排序,便于后续剪枝以及避免重复组合的产生。中的每个数字在每个组合中只能使用。解集不能包含重复的组合。: 如果当前数字大于目标。
2024-10-16 20:21:58
651
原创 39. 组合总和
则继续递归地尝试加入更多的元素。每次递归时,我们可以选择继续加入相同的元素(因为元素可以重复使用)。数组的每一个元素开始,尝试将当前元素加入组合中。如果当前组合的和等于。进行排序,这样做的目的是为了在递归过程中提前剪枝,避免不必要的递归。时,直接停止递归(因为后续的数字只会使得和更大),并回溯到上一层。如果至少一个数字的被选数量不同,则两种组合是不同的。,则将该组合加入结果集。如果当前组合的和小于。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。: 使用回溯的方法,从。
2024-10-16 20:19:22
465
原创 38. 外观数列
外观数列”是一个通过递归生成的序列,序列中的每一项是对前一项的描述。具体的描述方式类似于行程长度编码(RLE),即按字符连续重复的次数来描述每一位。(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。为了生成第 n 个元素,我们需要从第 1 项开始,逐步构造后续项。第 1 项为 "1",后续每一项由对前一项进行“描述”得到。因此压缩后字符串变为。
2024-10-15 22:54:44
560
原创 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-10-13 19:53:37
299
原创 34. 在排序数组中查找元素的第一个和最后一个位置
请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。
2024-10-12 22:21:30
584
原创 33. 搜索旋转排序数组
的算法来解决旋转数组的问题。,则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。
2024-10-12 22:18:11
425
原创 32. 最长有效括号
栈方法:使用栈来保存括号索引,时间复杂度 O(n),空间复杂度 O(n)。动态规划:通过动态规划记录每个位置的最长有效括号子串长度,时间复杂度 O(n),空间复杂度 O(n)。双指针法:通过两个计数器进行左右两次扫描,时间复杂度 O(n),空间复杂度 O(1)。
2024-10-11 22:09:52
807
原创 31. 下一个排列
的下一个字典序排列,这意味着要找到比当前排列大的下一个可能排列,如果不存在更大的排列,则返回字典序最小的排列。字典序排列类似于词典中的单词顺序。就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。就是将其所有成员以序列或线性顺序排列。修改,只允许使用额外常数空间。
2024-10-11 22:00:53
569
原创 30. 串联所有单词的子串
中每个字符串的出现次数,并在检查每个子串时,对其进行匹配。中的所有字符串组成,并且每个子串中的字符串都必须是。中的元素,且每个元素只能使用一次。中的所有“串联子串”,这些子串由字符串数组。中的所有字符串,我们可以使用一个哈希表记录。中所有字符串以任意顺序排列连接起来的子串。:我们可以通过滑动窗口的方式遍历字符串。的子串,判断该子串是否由。:为了判断一个子串是否包含。中每个字符串的长度乘以。这个问题要求找到字符串。:每个子串的总长度是。中的字符串拼接而成。,则直接返回空列表。
2024-10-10 22:48:13
620
原创 29. 两数相除
整数除法应该向零截断,也就是截去(有符号整数,其数值范围是。乘法、除法和取余运算。假设我们的环境只能存储。给你两个整数,被除数。
2024-10-10 22:40:47
354
原创 28. 找出字符串中第一个匹配项的下标
KMP 的详细实现可以在需要优化效率的情况下考虑。它的核心是通过构建部分匹配表来减少不必要的重复匹配,使得时间复杂度能达到 O(n)。KMP(Knuth-Morris-Pratt)算法通过提前计算出匹配失败时应该从哪里继续匹配,避免重复的匹配过程。字符串的第一个匹配项的下标(下标从 0 开始)。字符串的第一个出现位置。KMP 方法的时间复杂度为。方法一:暴力匹配实现。
2024-10-09 21:48:52
924
原创 27. 移除元素
/ 它以不等于 val 的值排序。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。通过这样的方式,我们可以原地修改数组并将等于。一个指针遍历整个数组,另一个指针记录不等于。元素的顺序可能发生改变。如果所有的断言都通过,你的解决方案将会。为了解决这个问题,我们可以使用。
2024-10-09 21:44:29
547
原创 26. 删除有序数组中的重复项
/ 长度正确的期望答案。如果所有断言都通过,那么您的题解将被。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。
2024-10-08 21:08:11
381
原创 25. K 个一组翻转链表
个节点,我们要进行翻转。翻转过程中,我们需要重新连接前后段的节点,同时保证翻转后链表的顺序正确。个节点之后,继续对后面的节点重复这个过程,直到所有节点都处理完毕。个节点将其翻转,涉及到链表的操作。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。为 1,那么链表无需做任何变动,直接返回即可。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点时进行翻转,否则保持剩余节点的顺序。个节点一组进行翻转,请你返回修改后的链表。个节点,就不需要翻转这些节点。
2024-10-08 21:05:29
641
原创 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。要解决两两交换链表中相邻节点的问题,我们需要遍历链表并调整指针以交换相邻节点。因为我们不能修改节点的值,只能通过操作节点的。
2024-10-08 21:00:28
344
原创 21. 合并两个有序链表
由于链表的节点是通过指针连接的,因此不需要创建新的节点,只需要适当调整原链表节点的。新链表是通过拼接给定的两个链表的所有节点组成的。:为了简化操作(尤其是头节点的处理),我们创建一个虚拟头节点。要将两个升序链表合并为一个新的升序链表,本质上是一个。来指向新链表的最后一个节点,初始时指向。将两个升序链表合并为一个新的。,即新链表的头节点。
2024-10-07 09:41:59
460
原创 18. 四数之和
这道题目是经典的 "四数之和" 问题,它的本质是在一个整数数组中,寻找四个不同的数,使它们的和等于给定的目标值。的思想,类似于解决 "两数之和" 和 "三数之和" 的方法,但需要引入更多的边界条件和去重逻辑,确保四元组的唯一性。: 为了避免重复的四元组,需要对数组中的重复元素进行过滤。对于每一层循环中的当前数值,如果和前一个数相等,则跳过该数,避免处理相同的组合。同时,排序后的数组有利于去重处理,也能通过提前终止条件优化算法效率。此时,问题就简化成 "两数之和" 问题,即从剩余的数中找到两个数。
2024-10-05 21:52:38
1263
原创 17. 电话号码的字母组合
这个问题要求我们根据给定的数字字符串,找到所有对应的字母组合。可以将问题类比为手机键盘上输入字母的方式:每个数字对应若干个字母,我们需要找到输入的数字串能够组合出所有的字母排列。我们从字符串的第一个数字开始,遍历它所能对应的字母,并递归处理剩下的数字,直到处理完所有的数字。:首先,我们需要一个映射表,来存储数字 2-9 和对应的字母组合。:由于每个数字对应的字母是固定的,我们不用担心重复排列的问题,因此不需要额外的剪枝操作。:当我们遍历完数字字符串的每一个字符时,将当前的组合加入结果列表。
2024-10-05 21:39:05
270
原创 16.最接近的三数之和
与三数之和的题类似,首先对数组进行排序。排序后的数组使得我们可以有效地使用双指针法来找到和最接近目标值的三元组。:遍历结束后,返回最接近的三元组的和。,然后通过双指针法来寻找另外两个数。:遍历排序后的数组,固定一个数。中选出三个整数,使它们的和与。假定每组输入只存在恰好一个解。使得三数之和最接近目标值。
2024-10-04 09:00:13
378
原创 15.三数之和
数组排序需要 O(n log n),双指针法遍历所有可能的三元组则需要 O(n^2)。,我们只使用了常量空间来存储变量,除了返回的结果列表以外,没有使用额外的空间。答案中不可以包含重复的三元组。,判断是否存在三元组。
2024-10-04 08:57:13
252
原创 14. 最长公共前缀
是最短字符串的长度。在最坏的情况下,每次都需要比较整个前缀和每个字符串,导致时间复杂度为 O(n * m)。,使用了常量空间存储前缀变量和循环变量,不需要额外的空间。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串。
2024-10-03 08:00:00
254
原创 13. 罗马数字转整数
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做。:我们只用了固定大小的哈希表来存储罗马数字映射,因此空间复杂度是常数。我们只需要遍历一次字符串。给定一个罗马数字,将其转换成整数。,即为两个并列的 1。
2024-10-02 17:51:20
320
原创 12. 整数转罗马数字
来拼接结果,但最终的输出长度最多只与罗马数字的长度成正比(而罗马数字的长度不会随输入整数无限增长),因此使用的额外空间是常数级的。数组的长度固定为 13(代表 13 个不同的罗马数字符号),并且每次遍历时的减法操作次数是有限的,因此时间复杂度是常数。罗马数字是通过添加从最高到最低的小数位值的转换而形成的。给定一个整数,将其转换为罗马数字。
2024-10-02 17:50:53
336
原创 11. 盛最多水的容器
这个问题要求我们找到两条垂直的线,计算它们与 x 轴构成的容器所能盛放的最大水量。容器的容量由两条线之间的最短线的高度和它们之间的距离决定。我们可以使用双指针的方法来解决这个问题。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2024-10-02 17:37:37
949
原创 10. 正则表达式匹配
这是一个经典的动态规划问题。我们可以通过动态规划来解决这个问题。匹配一个或多个字符:需要当前字符。的,而不是部分字符串。,其中模式包含特殊字符。,请你来实现一个支持。
2024-10-01 10:12:42
371
原创 7. 整数反转
我们需要考虑如何在反转过程中避免超出 32 位整数范围。如果反转后整数超过 32 位的有符号整数的范围。给你一个 32 位的有符号整数。中的数字部分反转后的结果。
2024-09-28 20:08:00
494
原创 5. 最长回文子串
由于回文可能是奇数长度(以单个字符为中心)或者偶数长度(以两个字符中间的间隙为中心),我们需要分别考虑这两种情况。这种方法利用了回文的对称性质:以每个字符为中心向两边扩展,找到最长的回文子串。虽然时间复杂度不是最优的,但其空间复杂度是。解决最长回文子串问题的常见方法之一是。该算法的时间复杂度是。(不考虑返回值的空间)
2024-09-26 21:16:10
208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人