自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode - LCR 173. 点名

摘要:该文讨论了LeetCode题目LCR173(点名)的二分查找解法。初始代码在处理缺失最后一个数字的情况时存在缺陷,当数组完整时会导致错误。正确解法应在循环结束后进行额外检查:如果当前元素值等于其索引,说明缺失的是最后一个数字(n-1),此时应返回right+1;否则返回right。改进后的代码通过增加边界条件判断,解决了原方案的不足,保证了在所有情况下都能正确识别缺失的数字。(149字)

2025-06-14 16:11:10 183

原创 LeetCode - 153. 寻找旋转排序数组中的最小值

摘要:文章详细解析了力扣153题"寻找旋转排序数组中的最小值"的二分查找解法。旋转排序数组被分成两个有序子数组,最小值位于第二个子数组的首位。算法通过比较中间元素与右边界值来确定搜索区间:当nums[mid]>nums[right]时最小值在右半部分,否则在左半部分。以数组[4,5,6,7,0,1,2]为例,展示了二分查找的具体步骤。文章还分析了常见的错误写法(如使用独立if语句、错误的终止条件等),并给出了正确的代码实现。该解法时间复杂度为O(logn),空间复杂度为O(1)。

2025-06-14 15:52:49 872

原创 LeetCode - 852. 山脉数组的峰顶索引

摘要:本文介绍LeetCode 852题"山脉数组的峰顶索引"的二分查找解法。通过比较中间元素与其右侧元素的大小来判断当前处于上坡还是下坡:若arr[mid] < arr[mid+1]则向右查找,反之则向左查找或定位当前位置。该方法时间复杂度为O(logn),空间复杂度O(1)。最终返回left与right重合时的索引即为峰顶位置。代码实现简洁高效,符合题目要求。

2025-06-14 15:12:40 294

原创 LeetCode - 35. 搜索插入位置

文章摘要:本文解析了力扣题35"搜索插入位置"的二分查找解法,重点指出常见错误是循环结束后返回right而非left。关键点在于二分循环终止时:left指向第一个≥target的位置,right指向最后一个<target的位置。因此对于插入位置问题,应返回left。正确代码使用标准二分模板,通过维护左右指针缩小范围,最终返回left作为插入位置索引。

2025-06-14 14:55:19 165

原创 LeetCode - 69. x 的平方根

摘要:本文介绍了使用二分查找算法计算整数平方根的正确方法。关键点包括:初始化搜索范围为[1,x],通过比较mid与x/mid避免整数溢出,正确返回right值作为结果。针对常见错误写法进行分析,指出其初始化和返回值问题,以及整数溢出风险。最终给出正确解法,确保在所有情况下都能准确计算平方根的整数部分,包括处理x=0的特殊情况。该方法通过优化比较方式和边界处理,保证了算法的高效性和正确性。

2025-06-14 14:40:58 246

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

这篇文章介绍了在排序数组中查找目标值起始和结束位置的二分查找算法。主要内容包括: 查找左边界时使用向下取整的中值计算,通过right=mid保留可能的左边界 查找右边界时使用向上取整的中值计算,通过left=mid保留可能的右边界 关键点说明:循环条件使用left<right避免死循环,查找左右边界时采用不同的中值计算方式 常见错误分析:展示了可能导致边界遗漏或死循环的错误写法 算法正确性验证:以[5,7,7,8,8,10]为例,详细演示了查找target=8的执行过程 比较了不同中值计算方式对算法性

2025-06-14 11:44:17 1265

原创 LeetCode - 704. 二分查找

本文介绍了二分查找算法的实现思路。算法通过初始化左右指针,在[left,right]区间内循环查找目标值。每次迭代计算中间索引,将目标值与中间元素比较,根据结果调整搜索区间。关键点包括:使用left<=right确保全面检查、正确的区间更新方式以及避免整数溢出。文章以实例演示搜索过程,分析时间复杂度为O(logn),空间复杂度为O(1)。最后指出了常见错误写法:错误的比较对象、条件判断结构和循环条件设置,并给出了正确代码实现。

2025-06-14 09:12:21 495

原创 LeetCode - 224. 基本计算器

摘要:本文介绍了力扣题目224"基本计算器"的解法,使用双栈处理包含加减法和括号的表达式。算法核心是数字栈和运算符栈的配合,通过优先级规则处理运算顺序,特别用栈处理括号层级。文中详细演示了表达式"1+(4+5+2)-3"的计算流程,并对比了正确与错误的代码实现,最终给出正确解法:使用单栈保存中间结果和符号,处理加减号时更新结果,遇到括号时保存当前状态,处理完括号内运算后再恢复之前状态。

2025-06-14 08:14:19 380

原创 LeetCode - 76. 最小覆盖子串

摘要: 本文详细介绍了力扣76题「最小覆盖子串」的滑动窗口解法。通过预处理阶段建立哈希表记录目标字符的需求量,使用双指针扩展和收缩窗口,确保窗口内包含所有目标字符且出现次数满足要求。关键在于维护valid变量验证当前窗口的有效性,并在收缩时更新最小窗口信息。时间复杂度为O(n),空间复杂度为O(字符集大小)。以示例s="ADOBECODEBANC"和t="ABC"逐步演示窗口移动过程,最终返回最小子串"BANC"。文章还指出常见错误(如未初始化和条

2025-06-13 19:46:47 713

原创 LeetCode - 387. 字符串中的第一个唯一字符

【摘要】本文解析了力扣387题"字符串中的第一个唯一字符"的解法。正确解法使用哈希表(unordered_map)统计字符频率,先遍历字符串记录每个字符出现次数,再遍历查找第一个频率为1的字符。常见错误包括:1)误用vector<char,int>而非哈希表;2)vector无法用字符作为下标;3)遍历对象错误。正确代码应使用unordered_map<char,int>存储频率,并两次遍历字符串,时间复杂度O(n)。示例代码展示了如何正确实现这一算法。

2025-06-13 16:38:22 340

原创 LeetCode - 904. 水果成篮

【摘要】题目"水果成篮"要求在整数数组中找到最长的连续子数组,其中最多包含两种不同的数字(水果种类)。采用滑动窗口法,用双指针标记窗口边界,哈希表统计水果种类。当种类超过2时收缩左边界,直至窗口合法。常见错误是未及时删除哈希表中计数为0的水果种类,导致统计错误。正确解法需在减少计数后检查并删除零值项,同时移动左指针。时间复杂度为O(n),空间复杂度O(1)。示例代码展示了正确处理逻辑,确保窗口内始终不超过2种水果,并动态更新最大长度。

2025-06-13 15:43:01 389

原创 LeetCode - 1047. 删除字符串中的所有相邻重复项

即使你检查了输入字符串 s 是否为空,但在第一次迭代时,栈 st 仍然是空的。当你尝试访问 st.top() 时,如果栈为空,这会导致未定义行为。这是一个典型的栈应用问题。我们可以用栈来跟踪字符,当遇到与栈顶相同的字符时,就将栈顶元素弹出(相当于删除这对相邻重复项)。从栈中弹出元素的顺序与它们在原始字符串中的顺序相反,所以最终结果需要反转。将栈中元素从底到顶组成字符串:"ca"最终栈中的字符:['c', 'a']

2025-06-11 11:17:09 346

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

因此,当数组中除了一个数出现一次外,其他数都出现两次时,将所有数异或在一起,相同的数会两两抵消(变为0),最终只剩下那个出现一次的数。这个解法的时间复杂度是O(n),空间复杂度是O(1),完美满足题目要求的线性时间和常量额外空间。

2025-06-11 10:36:33 350

原创 LeetCode - 228. 汇总区间

原因:当处理完一个区间后,left 需要移动到下一个区间的起点,即当前区间的终点的下一个位置 (right + 1)。原因:在 for 循环中 int right = 0 已定义了循环变量,但内部又使用 right = left 覆盖了这个值,这会导致循环异常,因为循环变量被意外修改。原因:当 right 是数组的最后一个元素时,right+1 将超出数组边界,导致访问无效内存,这是未定义行为,可能导致程序崩溃。result 是 vector<int> 类型,但函数返回类型是 vector<string>

2025-06-11 09:39:52 522

原创 LeetCode - 394. 字符串解码

该算法能够处理嵌套的编码,例如"2[a2[bc]]"这样的情况。时间复杂度为O(n),其中n是输入字符串的长度。一个存储重复次数,一个存储字符串。最终返回处理后的字符串。

2025-06-10 23:26:18 438

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

在 while 循环结束后,curr 已经是 nullptr(因为循环条件是 while(curr))。这行代码实际上是将 prev->next 设置为 nullptr,这意味着它会删除从 prev->next 开始的所有节点,而不仅仅是删除倒数第 n 个节点。这段代码让 curr 指针只前进了 n 步。如果您想删除倒数第 n 个节点,并且 prev 需要指向要删除节点的前一个节点,那么 curr 应该前进 n+1 步。

2025-06-10 15:19:12 436

原创 LeetCode - LCR 136. 删除链表的节点

在循环中,您先移动了prev和curr指针,然后才检查值,这会导致指针错位。正确的做法是先检查值,然后根据情况决定是否移动指针。在while循环中,您先移动了curr指针,然后访问curr->val,如果curr变成nullptr,这会导致空指针访问。您将prev直接设为prev->next,这样prev和curr就指向了同一个节点,无法正确删除节点。如果头节点的值等于val,您的代码不会删除它。

2025-06-10 14:35:16 272

原创 LeetCode - 557. 反转字符串中的单词 III

如果字符串不以空格结尾,最后一个单词不会被处理。

2025-06-10 12:34:47 490

原创 LeetCode - 2. 两数相加

原代码没有移动结果链表的指针,导致每次新节点都会覆盖前一个节点,最终结果链表只有一个节点。修改后确保每次添加新节点后,指针移动到最新节点,保持链表的正确结构。原循环条件只在两个链表都有节点时执行,会忽略较长链表的剩余部分和最后可能存在的进位。修改后的条件确保处理所有情况:任一链表还有节点或存在进位时都会继续计算。while(cur1 && cur2)只处理两个链表长度相同的部分,忽略了较长链表的剩余部分和可能的进位。同时遍历两个链表,只要有一个链表还有节点或者有进位,就继续计算。函数末尾缺少返回语句。

2025-06-10 09:50:10 911

原创 LeetCode - 206. 反转链表

递归反转链表的核心思想是:先反转链表的后续部分,然后再处理当前节点。这种"从后往前"的处理方式利用了递归的特性。没有判断!head->next在递归过程中,当 head 是链表的最后一个节点时,head->next 是 nullptr执行 head->next->next = head 会导致解引用空指针,造成运行时错误

2025-06-10 00:17:35 324

原创 LeetCode - 199. 二叉树的右视图

DFS访问顺序(先右后左)是:1 -> 3 -> 6 -> 2 -> 5 -> 4。右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。最终result=[1,3,6],正好是树的右视图。如果当前节为空,直接返回检查当前深度是否等于结果数组的长度如果是,说明这是当前深度第一个被访问的节点,将其值加入结果数组如果不是,说明该深度已经有节点被加入结果,不做操作先递归访问右子树(深度+1),再递归访问左子树(深度+1)

2025-06-09 23:05:05 1006

原创 LeetCode - 260. 只出现一次的数字 III

异或(XOR)是一种基本的位运算操作,符号通常表示为 ^。它有以下特点:异或是一种二元运算,对两个位(bit)进行操作当两个位相同时,结果为0当两个位不同时,结果为10 ^ 0 = 00 ^ 1 = 11 ^ 0 = 11 ^ 1 = 0任何数与0异或等于其本身:a ^ 0 = a任何数与自身异或等于0:a ^ a = 0异或满足交换律:a ^ b = b ^ a异或满足结合律:(a ^ b) ^ c = a ^ (b ^ c)

2025-06-09 22:31:45 963

原创 LeetCode - 3. 无重复字符的最长子串

维护一个"窗口",这个窗口内的所有字符都是不重复的。当遇到重复字符时,调整窗口左边界,确保窗口内无重复字符。滑动窗口是处理子串/子数组问题的常用技巧,结合哈希表可以高效解决此问题。步骤6:右指针移动到第二个'c'步骤7:右指针移动到第三个'b'步骤4:右指针移动到第二个'a'步骤5:右指针移动到第二个'b'步骤8:右指针移动到第四个'b'最终结果:最大无重复子串长度为3。步骤1:右指针移动到'a'步骤2:右指针移动到'b'步骤3:右指针移动到'c'

2025-06-09 18:03:50 360

原创 LeetCode - 647. 回文子串

目录题目思路步骤字符串: "abcba"中心点 i=0 (字符 'a')中心点 i=1 (字符 'b')中心点 i=2 (字符 'c')中心点 i=3 (字符 'b')中心点 i=4 (字符 'a')总结计算时间和空间复杂度647. 回文子串 - 力扣(LeetCode)中心扩展算法是寻找回文串的一种直观方法,基于以下观察:回文串的两种类型奇数长度回文串:中心是单个字符偶数长度回文串:中心是两个相邻字符之间的位置遍历所有可能的中心点:对每个中心点,尝试扩展:统计所有回文子串:过程奇数长度扩展 (left=0

2025-06-09 16:50:15 741

原创 LeetCode - 949. 给定数字能组成的最大时间

调用 prev_permutation(A.begin(), A.end())最直接的思路是:从大到小尝试所有可能的排列,找到第一个能组成有效时间的排列。假设输入是 A = [1, 2, 3, 4],我们要找出能组成的最大时间。排序后 A = [4, 3, 2, 1]当前排列: [4, 3, 2, 1]新排列: [4, 3, 1, 2]新排列: [4, 2, 3, 1]新排列: [2, 3, 4, 1]最大有效时间是 "23:41"... (继续检查更多排列)

2025-06-09 15:58:03 598

原创 LeetCode - 543. 二叉树的直径

二叉树的直径是指树中任意两个节点之间的最长路径长度。这个路径不一定要经过根节点,但一定会经过某个节点,该节点成为这条路径的"最低公共祖先"。是它左子树的最大深度加上右子树的最大深度。定义直径:二叉树的直径是指树中任意两个节点之间的最长路径长度。关键洞察:对于树中的任意一个节点,经过该节点的最长路径长度等于其左子树的最大深度加上右子树的最大深度。直径计算错误:直径计算应该是左子树深度加右子树深度,而不是取它们的最大值。结果:遍历完整棵树后,全局变量 result 中存储的就是树的直径。

2025-06-09 10:58:55 423

原创 LeetCode - 238. 除自身以外数组的乘积

不能直接用向量乘以整数,需要对向量的每个元素进行操作。应该是将当前结果乘以左侧乘积,然后更新左侧乘积。第二次遍历(从右到左):计算每个位置右侧所有元素的乘积,并与之前结果相乘。右侧遍历的逻辑也有问题,不应该直接赋值 right = nums[i]第一次遍历(从左到右):计算每个位置左侧所有元素的乘积。创建结果数组:初始化为全1,因为乘法的单位元是1。最终 result = [24,12,8,6]此时 result = [1,1,2,6]

2025-06-09 10:29:22 784

原创 LeetCode - 56. 合并区间

需要在循环结束后额外添加最后一个合并区间,因为循环内部只有在"没有重叠"的情况下才会添加区间。考虑这个流程:循环中,只有当前区间与前一个区间不重叠时,才会把前一个合并好的区间添加到结果中对于最后一个区间(或最后一组合并的区间),循环结束后不会再有新的区间来判断它是否需要被添加举个例子,输入 [[1,3], [2,6], [8,10]]:遍历到 [2,6] 时,发现与 [1,3] 重叠,更新 right=6,但不添加任何结果遍历到 [8,10] 时,发现与 [1,6] 不重叠,所以添加 [1

2025-06-09 08:23:27 585

原创 LeetCode - 53. 最大子数组和

逻辑错误:这个的代码没有正确实现Kadane算法。你只是在累加所有元素(currenSum += nums[i]),这计算的是整个数组的和,而不是最大子数组和。maxSum初始化错误:应该初始化为数组的第一个元素,而不是0(因为数组可能全为负数)。比较错误:你在比较nums[i]和maxSum,但应该比较currenSum和maxSum。没有实现核心逻辑:没有实现"选择继续当前子数组还是开始新子数组"的逻辑。你在最后返回的是currenSum而不是maxSum

2025-06-08 23:38:46 710

原创 LeetCode - 560. 和为 K 的子数组

解题思路有两种主要方法:暴力法:检查所有可能的子数组,计算它们的和,统计等于k的子数组数量前缀和 + 哈希表:使用前缀和和哈希表来优化,这是最优解我们要找的是所有满足sum[j+1] - sum[i] = k的(i,j)对,等价于寻找所有满足sum[i] = sum[j+1] - k的(i,j)对。时间复杂度:O(n),其中n是数组长度,我们只需要遍历数组一次。空间复杂度:O(n),最坏情况下哈希表需要存储n个不同的前缀和

2025-06-08 22:50:13 593

原创 LeetCode - 148. 排序链表

你的循环条件是while(head->next),这不会移动,会导致无限循环。你的fast和slow都从head开始,但标准做法是slow从head开始,fast从head->next开始。在递归调用时,你返回的是merge(head, mid),但应该是merge(left, right)创建了dummy节点但没有释放,应该返回dummy->next并释放dummy。缺少递归的基本情况检查,如果head为空或只有一个节点,应该直接返回。在处理剩余节点时,你的循环条件是while(l1||l2),

2025-06-08 21:36:17 782

原创 归并排序:分治思想的高效排序

归并排序是一种基于分治思想的高效排序算法。其核心过程分为"分割"和"合并"两个阶段:先将数组递归分成最小单元,再将有序子数组逐层合并。算法实现包括递归和非递归两种方式,递归实现直观体现分治思想,非递归实现通过迭代控制合并区间。无论哪种方式,合并操作都需要额外空间存储临时结果。归并排序的时间复杂度为O(NlogN),是一种稳定的排序方法。算法需处理边界情况,如合并区间越界等问题。

2025-06-08 18:56:49 1222

原创 LeetCode - 226. 翻转二叉树

这种方法的优点是避免了递归调用的栈开销,特别是对于非常深的树,可以避免栈溢出的风险。时间复杂度仍然是O(n),其中n是树中节点的数量,因为每个节点只会被处理一次。函数声明返回类型是TreeNode*,但在if(!root)条件中返回的是return;应该返回nullptr表示空树,这样当递归到叶子节点之外时,可以正确地返回空指针给上一层调用。将该节点的非空子节点压入栈中。当栈不为空时,弹出栈顶节点。创建一个栈,将根节点入栈。重复步骤2-4直到栈为空。交换该节点的左右子树。

2025-06-08 17:48:13 214

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

反序构建:使用第一个栈(s1)进行类似前序遍历的操作,但是入栈顺序改为"先左后右",这样从s1出栈的顺序就变成了"根-右-左",将从s1出栈的元素依次压入第二个栈(s2),s2出栈时的顺序就是"左-右-根",正好是后序遍历的顺序,操作步骤:将根节点压入s1,当s1不为空时:,弹出s1栈顶节点并压入s2,将该节点的左子节,压入s1(如果存在),将该节点的右子节点压入s1(如果存在),当s1为空时,依次从s2弹出元素,这就是后序遍历的结果,原理解释:,第一个栈(s1)用于遍历树并产生"根-右-左"的顺

2025-06-08 16:19:40 334

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

在尝试访问node->val之前,node已经是nullptr。在内层while循环结束后,node已经是nullptr,因为循环的终止条件就是node为空。因此,在这之后直接访问node->val和node->right会导致空指针解引用错误。在尝试访问node->val之前,node已经是nullptr。在内层while循环结束后,node已经是nullptr,因为循环的终止条件就是node为空。因此,在这之后直接访问node->val和node->right会导致空指针解引用错误。

2025-06-08 10:58:00 279

原创 Lrc歌词分析

摘要:本文介绍了一个基于Qt框架的LRC歌词同步播放界面设计与实现。系统包含动画效果的窗口显示/隐藏功能、歌词解析与同步显示机制。通过QPropertyAnimation实现窗口平滑弹出和收回效果,无边框窗口设计增强用户体验。采用结构体存储歌词时间信息,实现歌词随播放进度动态滚动显示。系统支持标准LRC格式解析,自动匹配歌曲对应的歌词文件,并在播放过程中实时同步显示当前歌词及前后三行内容。关键技术包括Qt布局管理、动画效果实现、文件解析和歌词时间同步算法。

2025-06-06 18:38:27 1143

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

前序遍历遵循"根-左-右"顺序访问节点。递归法直接按该顺序处理:先保存根值,再递归处理左子树和右子树。非递归法使用栈模拟:先将根节点入栈,循环中弹出节点访问后,按"右-左"顺序压入子节点(利用栈的LIFO特性确保处理顺序正确)。两种方法时间复杂度均为O(n),空间复杂度递归法为O(h)(调用栈深度),迭代法栈空间也是O(h)。典型应用包括树的结构复制、前缀表达式生成等需要优先处理根节点的场景。

2025-06-03 23:12:06 518 1

原创 界面分析 - 上

摘要:本文介绍了一个音乐播放器的界面设计方案,主要分为Head区和Body区两大模块。Head区包含图标、搜索框、换肤按钮等基础控件。Body区分左右两部分:左侧为在线音乐和我的音乐分类选择区,采用自定义按钮控件;右侧为Page展示区,包含歌曲信息页、播放进度条和控制区。界面支持点击左侧按钮切换右侧页面内容,推荐页面具有轮播效果,播放页集成歌词同步显示功能。所有页面通过QStackedWidget控件管理,实现页面切换效果。该设计采用自定义控件提高复用性,并计划使用QTDesigner完成界面布局。

2025-06-02 23:39:18 985

原创 LeetCode - 101. 对称二叉树

本文介绍判断二叉树对称性的递归解法。首先处理空树情况,对于非空树,通过isMirror函数比较左右子树是否互为镜像。关键步骤包括:检查节点是否同时为空或单边为空,比较节点值,以及递归交叉比较左左与右右、左右与右左子树。常见错误是遗漏节点值比较或交叉递归比较,正确写法需要同时满足三种条件:结构对称、节点值相等和子树的递归对称性验证。该算法时间复杂度为O(n),空间复杂度为O(h),其中h为树高。

2025-06-01 09:45:20 221

原创 LeetCode - 100. 相同的树

本文介绍了使用深度优先搜索(DFS)判断两棵二叉树是否相同的方法。解题步骤包括:1)基本情况判断:若两树均为空则返回true;若仅一树为空则返回false;2)节点值比较;3)递归比较左右子树。正确的实现采用DFS递归方式,通过"与"操作连接所有判断条件。时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。该方法确保了只有当两棵树的结构和节点值完全相同时才返回true。

2025-06-01 08:50:53 327 1

耗时一个月,15万字+的Linux思维导图!!!

耗时一个月,15万字+的Linux思维导图!!!

2025-05-31

空空如也

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

TA关注的人

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