- 博客(63)
- 收藏
- 关注
原创 121. 买卖股票的最佳时机
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。你只能买一次、卖一次(而且买入在前,卖出在后)。如果价格一直下降(没法盈利),返回。:O(1)(只用了常数变量)买入这只股票,并选择在。用当前价格减去历史最低价。:O(n)(只遍历一次)和最大利润比较,更新。
2025-04-26 16:24:48
796
原创 119. 杨辉三角 II
O(rowIndex2)O(rowIndex^2)O(rowIndex2)(两层循环):O(rowIndex)O(rowIndex)O(rowIndex)(只用一个数组)在「杨辉三角」中,每个数是它左上方和右上方的数的和。因为从后往前,所以不会覆盖前面需要用的数字。中间的数字 = 上一行的相邻两个数字之和。不断推导下一行,一直推到第。第 1 行:扩展一位 ->第 2 行:扩展一位 ->第 3 行:扩展一位 ->,返回「杨辉三角」的第。每次扩展一位,比如变。
2025-04-26 15:42:15
433
原创 118. 杨辉三角
时间复杂度:O(numRows²),因为每一行最多要填 numRows 个数;中间的元素 = 上一行左上角 + 右上角的两个数字之和。在「杨辉三角」中,每个数是它左上方和右上方的数的和。空间复杂度:O(numRows²),存储所有值。生成「杨辉三角」的前 numRows。每一行的第一个和最后一个元素是 1;给定一个非负整数 numRows。
2025-04-24 22:04:21
396
原创 111. 二叉树的最小深度
最小深度 =从根节点到最近的叶子节点的路径上的节点数。叶子节点:左右子节点都为空的节点。最小深度路径:只要找到第一个叶子节点即可停止,不需要遍历所有。
2025-04-24 21:39:16
454
原创 108. 将有序数组转换为二叉搜索树
取决于树的高度,平衡 BST 的高度是 log 级别。左半部分递归构建左子树,右半部分递归构建右子树。排列,请你将其转换为一棵 平衡 二叉搜索树。→ 任意一个节点的左右子树高度差不超过 1。找到当前数组的“中间元素”,作为根节点。→ 所以中间的元素最适合做根节点。构建完就得到一棵平衡的 BST。每个元素都恰好被访问一次。
2025-04-22 22:25:34
172
原创 104. 二叉树的最大深度
O(h),其中 h 是树的高度,也就是递归栈的深度,最坏情况是 O(n)(退化成链表),最优情况是 O(log n)(完全平衡树)。O(n),其中 n 是树的节点数,我们每个节点只访问一次。是指从根节点到最远叶子节点的最长路径上的节点数。然后 +1(因为要加上当前的根节点)分别求左子树和右子树的最大深度。取这两个深度的最大值。
2025-04-21 22:38:52
308
原创 101. 对称二叉树
O(n),n 是节点数,遍历了整棵树。:O(h),h 是树的高度,用于递归栈。左子树的左边 == 右子树的右边。左子树的右边 == 右子树的左边。给你一个二叉树的根节点。, 检查它是否轴对称。
2025-04-20 15:54:53
259
原创 100. 相同的树
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,其中 h 是树的高度,递归使用的系统栈空间最多为树的高度。,其中 n 是树中节点的个数。我们访问每个节点一次。,编写一个函数来检验这两棵树是否相同。对两个二叉树的根节点。递归地比较它们的左子树和右子树。(空),说明结构一致,返回。两个节点的值不相同,返回。给你两棵二叉树的根节点。,说明结构不同,返回。
2025-04-20 15:03:56
307
原创 94. 二叉树的中序遍历
空间复杂度 = 递归调用栈 O(h) + 结果数组 O(n)O(n)总体空间复杂度(不论递归深度如何,最终结果数组都要 O(n))
2025-04-19 13:52:39
840
原创 88. 合并两个有序数组
最终,合并后数组不应由函数返回,而是存储在数组。因为如果从前往后合并,就可能要不断移动。最后的空位,不需要移动元素,效率高!的末尾(整体数组的最后一个位置);个元素表示应合并的元素,后。中,使合并后的数组同样按。的元素来腾位置,非常低效。而从后往前,我们利用。:O(1)(原地修改),然后相应指针前移;
2025-04-19 13:44:41
439
原创 83. 删除排序链表中的重复元素
删除所有重复的元素,使每个元素只出现一次。:链表是升序排列的,重复元素一定在一起。给定一个已排序的链表的头。一直重复这个过程直到。
2025-04-19 13:09:56
524
原创 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
296
原创 67. 二进制求和
O(max(M, N)),其中 M 和 N 分别为字符串 a 和 b 的长度。需要遍历两个字符串的全部位数。:O(max(M, N)),存储结果的字符串长度最多为 max(M, N) + 1(进位情况):计算结果按低位到高位顺序生成,需反转得到最终结果。:每位相加结果可能产生进位,需保存至下一位计算。:当两字符串长度不同时,短字符串高位视为0。,以二进制字符串的形式返回它们的和。:二进制加法从最低位(右端)开始计算。给你两个二进制字符串。
2025-04-17 20:56:06
168
原创 40. 组合总和 II
索引,确保在递归中不会重复选择已经选过的数字。同时,为了防止相同组合出现,我们在递归过程中要跳过重复的数字。: 我们使用递归来探索所有可能的组合。在每次递归时,选择当前数字,并将目标。减为 0,说明找到了一组解,将其加入结果列表;否则继续递归寻找下一个数字。在每一层递归中,为了保证每个数字只使用一次,我们通过维护一个。,则无需继续递归,因为数组是排序的,后续数字只会更大。数组进行排序,便于后续剪枝以及避免重复组合的产生。中的每个数字在每个组合中只能使用。解集不能包含重复的组合。: 如果当前数字大于目标。
2024-10-16 20:21:58
660
原创 39. 组合总和
则继续递归地尝试加入更多的元素。每次递归时,我们可以选择继续加入相同的元素(因为元素可以重复使用)。数组的每一个元素开始,尝试将当前元素加入组合中。如果当前组合的和等于。进行排序,这样做的目的是为了在递归过程中提前剪枝,避免不必要的递归。时,直接停止递归(因为后续的数字只会使得和更大),并回溯到上一层。如果至少一个数字的被选数量不同,则两种组合是不同的。,则将该组合加入结果集。如果当前组合的和小于。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。: 使用回溯的方法,从。
2024-10-16 20:19:22
474
原创 38. 外观数列
外观数列”是一个通过递归生成的序列,序列中的每一项是对前一项的描述。具体的描述方式类似于行程长度编码(RLE),即按字符连续重复的次数来描述每一位。(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。为了生成第 n 个元素,我们需要从第 1 项开始,逐步构造后续项。第 1 项为 "1",后续每一项由对前一项进行“描述”得到。因此压缩后字符串变为。
2024-10-15 22:54:44
567
原创 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-10-13 19:53:37
307
原创 34. 在排序数组中查找元素的第一个和最后一个位置
请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。
2024-10-12 22:21:30
592
原创 33. 搜索旋转排序数组
的算法来解决旋转数组的问题。,则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。
2024-10-12 22:18:11
432
原创 32. 最长有效括号
栈方法:使用栈来保存括号索引,时间复杂度 O(n),空间复杂度 O(n)。动态规划:通过动态规划记录每个位置的最长有效括号子串长度,时间复杂度 O(n),空间复杂度 O(n)。双指针法:通过两个计数器进行左右两次扫描,时间复杂度 O(n),空间复杂度 O(1)。
2024-10-11 22:09:52
818
原创 31. 下一个排列
的下一个字典序排列,这意味着要找到比当前排列大的下一个可能排列,如果不存在更大的排列,则返回字典序最小的排列。字典序排列类似于词典中的单词顺序。就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。就是将其所有成员以序列或线性顺序排列。修改,只允许使用额外常数空间。
2024-10-11 22:00:53
578
原创 30. 串联所有单词的子串
中每个字符串的出现次数,并在检查每个子串时,对其进行匹配。中的所有字符串组成,并且每个子串中的字符串都必须是。中的元素,且每个元素只能使用一次。中的所有“串联子串”,这些子串由字符串数组。中的所有字符串,我们可以使用一个哈希表记录。中所有字符串以任意顺序排列连接起来的子串。:我们可以通过滑动窗口的方式遍历字符串。的子串,判断该子串是否由。:为了判断一个子串是否包含。中每个字符串的长度乘以。这个问题要求找到字符串。:每个子串的总长度是。中的字符串拼接而成。,则直接返回空列表。
2024-10-10 22:48:13
629
原创 29. 两数相除
整数除法应该向零截断,也就是截去(有符号整数,其数值范围是。乘法、除法和取余运算。假设我们的环境只能存储。给你两个整数,被除数。
2024-10-10 22:40:47
358
原创 28. 找出字符串中第一个匹配项的下标
KMP 的详细实现可以在需要优化效率的情况下考虑。它的核心是通过构建部分匹配表来减少不必要的重复匹配,使得时间复杂度能达到 O(n)。KMP(Knuth-Morris-Pratt)算法通过提前计算出匹配失败时应该从哪里继续匹配,避免重复的匹配过程。字符串的第一个匹配项的下标(下标从 0 开始)。字符串的第一个出现位置。KMP 方法的时间复杂度为。方法一:暴力匹配实现。
2024-10-09 21:48:52
931
原创 27. 移除元素
/ 它以不等于 val 的值排序。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。通过这样的方式,我们可以原地修改数组并将等于。一个指针遍历整个数组,另一个指针记录不等于。元素的顺序可能发生改变。如果所有的断言都通过,你的解决方案将会。为了解决这个问题,我们可以使用。
2024-10-09 21:44:29
553
原创 26. 删除有序数组中的重复项
/ 长度正确的期望答案。如果所有断言都通过,那么您的题解将被。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。
2024-10-08 21:08:11
388
原创 25. K 个一组翻转链表
个节点,我们要进行翻转。翻转过程中,我们需要重新连接前后段的节点,同时保证翻转后链表的顺序正确。个节点之后,继续对后面的节点重复这个过程,直到所有节点都处理完毕。个节点将其翻转,涉及到链表的操作。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。为 1,那么链表无需做任何变动,直接返回即可。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点时进行翻转,否则保持剩余节点的顺序。个节点一组进行翻转,请你返回修改后的链表。个节点,就不需要翻转这些节点。
2024-10-08 21:05:29
646
原创 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。要解决两两交换链表中相邻节点的问题,我们需要遍历链表并调整指针以交换相邻节点。因为我们不能修改节点的值,只能通过操作节点的。
2024-10-08 21:00:28
350
原创 21. 合并两个有序链表
由于链表的节点是通过指针连接的,因此不需要创建新的节点,只需要适当调整原链表节点的。新链表是通过拼接给定的两个链表的所有节点组成的。:为了简化操作(尤其是头节点的处理),我们创建一个虚拟头节点。要将两个升序链表合并为一个新的升序链表,本质上是一个。来指向新链表的最后一个节点,初始时指向。将两个升序链表合并为一个新的。,即新链表的头节点。
2024-10-07 09:41:59
465
原创 18. 四数之和
这道题目是经典的 "四数之和" 问题,它的本质是在一个整数数组中,寻找四个不同的数,使它们的和等于给定的目标值。的思想,类似于解决 "两数之和" 和 "三数之和" 的方法,但需要引入更多的边界条件和去重逻辑,确保四元组的唯一性。: 为了避免重复的四元组,需要对数组中的重复元素进行过滤。对于每一层循环中的当前数值,如果和前一个数相等,则跳过该数,避免处理相同的组合。同时,排序后的数组有利于去重处理,也能通过提前终止条件优化算法效率。此时,问题就简化成 "两数之和" 问题,即从剩余的数中找到两个数。
2024-10-05 21:52:38
1283
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人