自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 191. 位1的个数

编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为。会安全地进行 32 次迭代,不会陷入死循环。所以我们依然能正确统计 1 的个数!

2025-06-19 22:03:53 158

原创 190. 颠倒二进制位

运算符含义用法说明按位与n & 1按位或<<左移相当于乘以 2>>右移相当于除以 2。

2025-06-19 21:43:52 525

原创 171. Excel 表列序号

从左往右,每一位表示一个权重值,类似 26 进制。没有“0”,也没有“26位是 Z+1”这种规则。,表示 Excel 表格中的列名称。,但权重是以 26 为底的。该列名称对应的列序号。

2025-06-18 22:05:34 319

原创 160. 相交链表

请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。让两个指针分别遍历两个链表,当指针走到链表末尾时,跳到另一个链表的开头。这样两人走的总路程是一样的(a + c + b + c)如果没有相交节点,最终两个指针都走到 null。如果有相交节点,最终会在相交处相遇;每个指针最多遍历两个链表长度。当他们第二次相遇的时候,就是。给你两个单链表的头节点。

2025-06-18 21:52:23 175

原创 145. 二叉树的后序遍历

后序遍历【左子树】 → 【右子树】 → 【根节点】这意味着:对每一个子树,先递归访问它的左子树,然后递归访问它的右子树,最后才处理该子树的根节点。

2025-06-16 21:42:35 337

原创 144. 二叉树的前序遍历

两种方式来实现前序遍历。

2025-06-16 21:27:57 186

原创 141. 环形链表

指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。去记录所有访问过的节点(虽然也能做),因为它额外用了。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。,就像赛道上跑步,快的迟早会追上慢的。仅仅是为了标识链表的实际情况。(链表尾),说明链表是无环的。,判断链表中是否有环。给你一个链表的头节点。

2025-06-15 20:02:31 255

原创 136. 只出现一次的数字

除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。那么我们把数组里所有数字都异或一遍,成对的数会变成 0,最终结果就是那个。由于所有数都出现两次,它们“配对异或”之后变成了。只用了一个整型变量,不管数组多大。,只出现一次的那个数字会被留下。(任何数和0异或还是它本身)出现了一次,结果应该返回。,把所有数都异或到一个变量。因为你只遍历了一次数组。(任何数和自己异或为0),就是我们想找的答案!

2025-06-15 19:47:12 444

原创 125. 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。判断是否正着读和反着读一致(是回文)→ ✅。过滤掉空格、标点,只保留字母数字 →。,说明每一对字符都匹配 → ✅ 是回文。判断是否是有效字符(字母或数字)。(从两端往中间走)判断字符是否一致。字母和数字都属于字母数字字符。→ 转成小写后也等,继续。判断一个字符串是否是。

2025-06-15 19:23:50 380

原创 121. 买卖股票的最佳时机

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。你只能买一次、卖一次(而且买入在前,卖出在后)。如果价格一直下降(没法盈利),返回。:O(1)(只用了常数变量)买入这只股票,并选择在。用当前价格减去历史最低价。:O(n)(只遍历一次)和最大利润比较,更新。

2025-04-26 16:24:48 819

原创 119. 杨辉三角 II

O(rowIndex2)O(rowIndex^2)O(rowIndex2)(两层循环):O(rowIndex)O(rowIndex)O(rowIndex)(只用一个数组)在「杨辉三角」中,每个数是它左上方和右上方的数的和。因为从后往前,所以不会覆盖前面需要用的数字。中间的数字 = 上一行的相邻两个数字之和。不断推导下一行,一直推到第。第 1 行:扩展一位 ->第 2 行:扩展一位 ->第 3 行:扩展一位 ->,返回「杨辉三角」的第。每次扩展一位,比如变。

2025-04-26 15:42:15 451

原创 118. 杨辉三角

时间复杂度:O(numRows²),因为每一行最多要填 numRows 个数;中间的元素 = 上一行左上角 + 右上角的两个数字之和。在「杨辉三角」中,每个数是它左上方和右上方的数的和。空间复杂度:O(numRows²),存储所有值。生成「杨辉三角」的前 numRows。每一行的第一个和最后一个元素是 1;给定一个非负整数 numRows。

2025-04-24 22:04:21 409

原创 111. 二叉树的最小深度

最小深度 =从根节点到最近的叶子节点的路径上的节点数。叶子节点:左右子节点都为空的节点。最小深度路径:只要找到第一个叶子节点即可停止,不需要遍历所有。

2025-04-24 21:39:16 496

原创 110. 平衡二叉树

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

2025-04-22 22:49:12 420

原创 108. 将有序数组转换为二叉搜索树

取决于树的高度,平衡 BST 的高度是 log 级别。左半部分递归构建左子树,右半部分递归构建右子树。排列,请你将其转换为一棵 平衡 二叉搜索树。→ 任意一个节点的左右子树高度差不超过 1。找到当前数组的“中间元素”,作为根节点。→ 所以中间的元素最适合做根节点。构建完就得到一棵平衡的 BST。每个元素都恰好被访问一次。

2025-04-22 22:25:34 195

原创 104. 二叉树的最大深度

O(h),其中 h 是树的高度,也就是递归栈的深度,最坏情况是 O(n)(退化成链表),最优情况是 O(log n)(完全平衡树)。O(n),其中 n 是树的节点数,我们每个节点只访问一次。是指从根节点到最远叶子节点的最长路径上的节点数。然后 +1(因为要加上当前的根节点)分别求左子树和右子树的最大深度。取这两个深度的最大值。

2025-04-21 22:38:52 319

原创 101. 对称二叉树

O(n),n 是节点数,遍历了整棵树。:O(h),h 是树的高度,用于递归栈。左子树的左边 == 右子树的右边。左子树的右边 == 右子树的左边。给你一个二叉树的根节点。, 检查它是否轴对称。

2025-04-20 15:54:53 280

原创 100. 相同的树

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,其中 h 是树的高度,递归使用的系统栈空间最多为树的高度。,其中 n 是树中节点的个数。我们访问每个节点一次。,编写一个函数来检验这两棵树是否相同。对两个二叉树的根节点。递归地比较它们的左子树和右子树。(空),说明结构一致,返回。两个节点的值不相同,返回。给你两棵二叉树的根节点。,说明结构不同,返回。

2025-04-20 15:03:56 330

原创 94. 二叉树的中序遍历

空间复杂度 = 递归调用栈 O(h) + 结果数组 O(n)O(n)总体空间复杂度(不论递归深度如何,最终结果数组都要 O(n))

2025-04-19 13:52:39 886

原创 88. 合并两个有序数组

最终,合并后数组不应由函数返回,而是存储在数组。因为如果从前往后合并,就可能要不断移动。最后的空位,不需要移动元素,效率高!的末尾(整体数组的最后一个位置);个元素表示应合并的元素,后。中,使合并后的数组同样按。的元素来腾位置,非常低效。而从后往前,我们利用。:O(1)(原地修改),然后相应指针前移;

2025-04-19 13:44:41 468

原创 83. 删除排序链表中的重复元素

删除所有重复的元素,使每个元素只出现一次。:链表是升序排列的,重复元素一定在一起。给定一个已排序的链表的头。一直重复这个过程直到。

2025-04-19 13:09:56 557

原创 70. 爬楼梯

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

2025-04-18 21:52:54 290

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

原创 67. 二进制求和

O(max(M, N)),其中 M 和 N 分别为字符串 a 和 b 的长度。需要遍历两个字符串的全部位数。:O(max(M, N)),存储结果的字符串长度最多为 max(M, N) + 1(进位情况):计算结果按低位到高位顺序生成,需反转得到最终结果。:每位相加结果可能产生进位,需保存至下一位计算。:当两字符串长度不同时,短字符串高位视为0。,以二进制字符串的形式返回它们的和。:二进制加法从最低位(右端)开始计算。给你两个二进制字符串。

2025-04-17 20:56:06 189

原创 66.加1

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

2025-04-16 22:14:41 191

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

单词的长度。

2025-04-16 22:01:39 350

原创 40. 组合总和 II

索引,确保在递归中不会重复选择已经选过的数字。同时,为了防止相同组合出现,我们在递归过程中要跳过重复的数字。: 我们使用递归来探索所有可能的组合。在每次递归时,选择当前数字,并将目标。减为 0,说明找到了一组解,将其加入结果列表;否则继续递归寻找下一个数字。在每一层递归中,为了保证每个数字只使用一次,我们通过维护一个。,则无需继续递归,因为数组是排序的,后续数字只会更大。数组进行排序,便于后续剪枝以及避免重复组合的产生。中的每个数字在每个组合中只能使用。解集不能包含重复的组合。: 如果当前数字大于目标。

2024-10-16 20:21:58 677

原创 39. 组合总和

则继续递归地尝试加入更多的元素。每次递归时,我们可以选择继续加入相同的元素(因为元素可以重复使用)。数组的每一个元素开始,尝试将当前元素加入组合中。如果当前组合的和等于。进行排序,这样做的目的是为了在递归过程中提前剪枝,避免不必要的递归。时,直接停止递归(因为后续的数字只会使得和更大),并回溯到上一层。如果至少一个数字的被选数量不同,则两种组合是不同的。,则将该组合加入结果集。如果当前组合的和小于。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。: 使用回溯的方法,从。

2024-10-16 20:19:22 487

原创 38. 外观数列

外观数列”是一个通过递归生成的序列,序列中的每一项是对前一项的描述。具体的描述方式类似于行程长度编码(RLE),即按字符连续重复的次数来描述每一位。(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。为了生成第 n 个元素,我们需要从第 1 项开始,逐步构造后续项。第 1 项为 "1",后续每一项由对前一项进行“描述”得到。因此压缩后字符串变为。

2024-10-15 22:54:44 583

原创 37. 解数独

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

2024-10-15 22:51:17 543

原创 36. 有效的数独

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

2024-10-13 19:57:30 614

原创 35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。

2024-10-13 19:53:37 318

原创 34. 在排序数组中查找元素的第一个和最后一个位置

请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。

2024-10-12 22:21:30 602

原创 33. 搜索旋转排序数组

的算法来解决旋转数组的问题。,则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。

2024-10-12 22:18:11 440

原创 32. 最长有效括号

栈方法:使用栈来保存括号索引,时间复杂度 O(n),空间复杂度 O(n)。动态规划:通过动态规划记录每个位置的最长有效括号子串长度,时间复杂度 O(n),空间复杂度 O(n)。双指针法:通过两个计数器进行左右两次扫描,时间复杂度 O(n),空间复杂度 O(1)。

2024-10-11 22:09:52 869

原创 31. 下一个排列

的下一个字典序排列,这意味着要找到比当前排列大的下一个可能排列,如果不存在更大的排列,则返回字典序最小的排列。字典序排列类似于词典中的单词顺序。就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。就是将其所有成员以序列或线性顺序排列。修改,只允许使用额外常数空间。

2024-10-11 22:00:53 596

原创 30. 串联所有单词的子串

中每个字符串的出现次数,并在检查每个子串时,对其进行匹配。中的所有字符串组成,并且每个子串中的字符串都必须是。中的元素,且每个元素只能使用一次。中的所有“串联子串”,这些子串由字符串数组。中的所有字符串,我们可以使用一个哈希表记录。中所有字符串以任意顺序排列连接起来的子串。:我们可以通过滑动窗口的方式遍历字符串。的子串,判断该子串是否由。:为了判断一个子串是否包含。中每个字符串的长度乘以。这个问题要求找到字符串。:每个子串的总长度是。中的字符串拼接而成。,则直接返回空列表。

2024-10-10 22:48:13 641

原创 29. 两数相除

整数除法应该向零截断,也就是截去(有符号整数,其数值范围是。乘法、除法和取余运算。假设我们的环境只能存储。给你两个整数,被除数。

2024-10-10 22:40:47 376

原创 28. 找出字符串中第一个匹配项的下标

KMP 的详细实现可以在需要优化效率的情况下考虑。它的核心是通过构建部分匹配表来减少不必要的重复匹配,使得时间复杂度能达到 O(n)。KMP(Knuth-Morris-Pratt)算法通过提前计算出匹配失败时应该从哪里继续匹配,避免重复的匹配过程。字符串的第一个匹配项的下标(下标从 0 开始)。字符串的第一个出现位置。KMP 方法的时间复杂度为。方法一:暴力匹配实现。

2024-10-09 21:48:52 944

原创 27. 移除元素

/ 它以不等于 val 的值排序。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。通过这样的方式,我们可以原地修改数组并将等于。一个指针遍历整个数组,另一个指针记录不等于。元素的顺序可能发生改变。如果所有的断言都通过,你的解决方案将会。为了解决这个问题,我们可以使用。

2024-10-09 21:44:29 562

空空如也

空空如也

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

TA关注的人

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