自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 110. 平衡二叉树

一棵二叉树是平衡的,满足以下两个条件:左子树是平衡二叉树;右子树是平衡二叉树;左右子树的高度差的绝对值不超过 1。

2025-04-22 22:49:12 410

原创 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

原创 70. 爬楼梯

你有多少种不同的方法可以爬到楼顶呢?如果最后一步是走 1 阶,那前面就是。如果最后一步是走 2 阶,那前面就是。

2025-04-18 21:52:54 265

原创 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

原创 66.加1

开始加 1;如果这一位加完不是 10,就直接返回;如果是 10,就变成 0,然后进位,继续处理前一位;如果最前一位也进位了,比如。

2025-04-16 22:14:41 172

原创 58.最后一个单词的长度

单词的长度。

2025-04-16 22:01:39 326

原创 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

原创 37. 解数独

编写一个程序,通过填充空格来解决数独问题。数独部分空格内已填入了数字,空白格用。

2024-10-15 22:51:17 501

原创 36. 有效的数独

验证已经填入的数字是否有效即可。

2024-10-13 19:57:30 584

原创 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

原创 23. 合并 K 个升序链表

请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。

2024-10-07 09:58:04 361

原创 22. 括号生成

代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。

2024-10-07 09:46:30 361

原创 21. 合并两个有序链表

由于链表的节点是通过指针连接的,因此不需要创建新的节点,只需要适当调整原链表节点的。新链表是通过拼接给定的两个链表的所有节点组成的。:为了简化操作(尤其是头节点的处理),我们创建一个虚拟头节点。要将两个升序链表合并为一个新的升序链表,本质上是一个。来指向新链表的最后一个节点,初始时指向。将两个升序链表合并为一个新的。,即新链表的头节点。

2024-10-07 09:41:59 465

原创 20. 有效的括号

用于存储遇到的左括号。每当遇到左括号时,推入栈中;每当遇到右括号时,检查栈顶元素是否与当前右括号匹配。

2024-10-06 18:26:35 392

原创 19. 删除链表的倒数第 N 个结点

使用两个指针。

2024-10-06 18:23:11 354

原创 18. 四数之和

这道题目是经典的 "四数之和" 问题,它的本质是在一个整数数组中,寻找四个不同的数,使它们的和等于给定的目标值。的思想,类似于解决 "两数之和" 和 "三数之和" 的方法,但需要引入更多的边界条件和去重逻辑,确保四元组的唯一性。: 为了避免重复的四元组,需要对数组中的重复元素进行过滤。对于每一层循环中的当前数值,如果和前一个数相等,则跳过该数,避免处理相同的组合。同时,排序后的数组有利于去重处理,也能通过提前终止条件优化算法效率。此时,问题就简化成 "两数之和" 问题,即从剩余的数中找到两个数。

2024-10-05 21:52:38 1283

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除