
LeetCode题解
文章平均质量分 88
LeetCode题解
zhangcoder
大一 KEEP CODING!
展开
-
L56.【LeetCode题解】 电话号码的字母组合
LeetCode电话号码字母组合问题的递归解法。给定数字字符串(2-9),需返回所有可能的字母组合。采用DFS递归算法:建立数字-字母映射表,递归函数通过level参数跟踪当前处理位置,当level等于输入长度时保存当前组合。处理特殊情况(空输入)直接返回空结果。以"258"为例,展示了递归调用的展开过程,最终得到3×3×3=27种组合。代码实现中注意字符串传值而非引用,确保递归回溯时正确性。时间复杂度为O(3^N ×4^M),其中N/M对应3/4字母的数字个数。原创 2025-05-31 21:59:33 · 1 阅读 · 0 评论 -
L54.【LeetCode题解】前缀和习题集1
两种使用前缀和/积与后缀和/积解决数组问题的算法。首先通过724题展示了寻找数组中心下标的方法,定义了前缀和数组dp[i]和后缀和数组g[i],通过比较两者来定位中心下标。接着在238题中,将概念扩展到乘积运算,构建前缀积数组f[i]和后缀积数组g[i],最终通过两者相乘得到除自身外的数组乘积。文章提供了两种代码实现方式,并强调了初始化条件和状态转移方程的重要性。这些方法都能在O(n)时间复杂度内高效解决问题,体现了前缀和/积技巧在数组处理中的实用性。原创 2025-05-24 20:36:46 · 845 阅读 · 0 评论 -
CC53.【C++ Cont】一维前缀和
介绍前缀和的概念及其在算法中的应用。前缀和是一种通过预处理数组来快速计算任意区间和的技术,能够显著优化时间复杂度。文章通过例题“一维前缀和”展示了暴力解法和前缀和解法的对比,指出前缀和解法通过预处理数组和递推公式,降低时间复杂度,还以“最大子段和”问题为例,展示了如何利用前缀和优化算法,通过改进方法1的两层循环,进一步降低时间复杂度。原创 2025-05-22 18:50:50 · 1104 阅读 · 0 评论 -
L53.【LeetCode题解】二分法习题集2
本文主要讨论了三个算法问题的分析与解决:寻找峰值、寻找旋转排序数组中的最小值以及点名问题。对于寻找峰值问题,通过二分法利用数组的二段性,时间复杂度为O(logn)。寻找旋转排序数组中的最小值问题,通过分析数组的增长趋势,设计二分法找到最小值,时间复杂度同样为O(logn)。点名问题则通过二分法查找缺失的学号,时间复杂度为O(logn)。每个问题都提供了详细的代码实现和提交结果,展示了如何通过二分法高效解决这些问题。原创 2025-05-21 21:35:12 · 659 阅读 · 0 评论 -
L52.【LeetCode题解】二分法习题集1
回顾二分查找的基本模板,详细分析了LCR072.x的平方根、搜索插入位置和LCR069.山脉数组的峰顶索引原创 2025-05-16 14:15:11 · 604 阅读 · 0 评论 -
CC52.【C++ Cont】二分查找的左、右边界模版
本文详细介绍了如何在有序数组中查找目标值的起始和结束位置,重点讲解了二分查找的优化方法。通过分析数组的二段性,文章提出了改进的二分查找模版,分别用于查找左边界和右边界。查找左边界时,通过调整循环条件和更新策略,确保算法在O(log n)时间复杂度内完成;查找右边界时,采用类似的思路,但需注意更新mid的公式以避免死循环。文章还提供了具体的代码实现,并强调了细节处理的重要性,如循环条件的设置和mid的更新方式。最后,总结了查找左边界和右边界的万能模版,便于读者在实际应用中快速套用。原创 2025-05-15 15:14:05 · 857 阅读 · 0 评论 -
L51.【LeetCode题解】LCR 072. x 的平方根 (6种方法)
计算非负整数平方根的多种方法,重点分析了卡马克逆平方根算法和牛顿迭代法的实现。此外,还介绍了循环枚举和内联汇编的方法,分别通过逐一尝试和直接调用硬件指令来实现平方根计算。原创 2025-05-13 09:17:42 · 1116 阅读 · 0 评论 -
CC51.【C++ Cont】二分查找的普通模版
本文回顾了二分查找算法,并提炼了其关键点。二分查找不仅适用于有序数组,还可用于满足特定规律的数组。文章以LeetCode 704题为例,详细分析了二分查找的实现过程,强调其核心思想是“分两段,舍一段,操作另一段”。通过代码示例展示了如何通过二分法高效查找目标值,并提供了防止整数溢出的方法。此外,文章还提到三分法、四分法及随机数分段的应用,总结了二分查找的通用模板及注意事项,如判断条件、mid的防溢出处理以及left和right的更新方式。原创 2025-05-12 10:09:35 · 816 阅读 · 0 评论 -
L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)
1.题目2.分析暴力解法方法1:排序(超时)方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握)能相等的前提:两个哈希表的大小相等哈希表有迭代器,可以使用范围for从头到尾遍历提交结果优化方法:定长滑动窗口提交结果使用哈希数组更快提交结果★★★更优化的方法:不定长滑动窗口(比定长的要快!)提交结果原创 2025-05-11 15:41:31 · 1032 阅读 · 0 评论 -
L48.【LeetCode题解】904. 水果成篮
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果。你想要尽可能多地收集水果。给你一个整数数组fruits,返回你可以收集的水果的数目。fruits = [3可以采摘全部 3 棵树。3可以采摘 [1,2,2] 这三棵树。如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。4可以采摘 [2,3,2,2] 这四棵树。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。,3,3,4]5。原创 2025-05-09 19:28:23 · 1291 阅读 · 0 评论 -
L47.【LeetCode题解】1658. 将 x 减到 0 的最小操作数
循环变量为right,每循环一次就sum+=nums[right],如果sum>target,那么left右移,直到sum<=target停止右移,如果满足sum==target,执行len=max(len,right-left+1)即可,right到nums.size()-1时停止循环。3+2+1+1+3==10,移除红色区域的元素即可,红色区域一共5个数,绿色区域的元素被保留。最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0。",红色区域的元素个数要最小,则。原创 2025-05-08 08:42:37 · 770 阅读 · 0 评论 -
L46.【LeetCode题解】1004. 最大连续1的个数 III
zero>k,需要出窗口,即left++,(left++之前,如果nums[left]为1,不变动zero;1.初始化窗口的两个端点:left=0,right=0,zero=0(zero为存储滑动窗口中0的个数)m时,讨论m个0翻转1个、翻转2个、...、翻转k个的情况,针对每个情况求连续1的最大个数。m时,讨论m个0翻转1个、翻转2个、...、翻转m个的情况,针对每个情况求连续1的最大个数。以[1,1,1,0,0,0,1,1,1,1,1],k==2为例。转化思路:设区间[left,right],原创 2025-05-04 15:19:25 · 911 阅读 · 0 评论 -
L45.【LeetCode题解】LCR 016. 无重复字符的最长子串
思想类似,都可以使用left和right来维护滑动窗口,如果right指向的字符与字符串的字符不重复,right++,如果right指向的字符与子字符串的字符重复,left++,枚举所有子串,之后判断每个子串是否无重复字符,固定左边界left,right从left+1。,查找以left为起点的无重复字符的子串,一旦发现right指向重复的字符,left++有可能重复的元素在窗口的中间的某个位置,此时需要。1.left++: 尝试去除重复的元素,,直到窗口中没有重复的元素才能更新结果,,所以其长度为 1。原创 2025-05-02 14:31:23 · 475 阅读 · 0 评论 -
L44.【LeetCode题解】面试题 01.07. 旋转矩阵(四种方法)
的起始点和终止点分别为A、B、C和D,则 A_x、A_y、B_x、B_y、C_x、C_y、D_x和D_y分别为它们的横纵坐标。矩阵表示的图像,其中每个像素的大小为 4 字节。如果对于一个N*N的矩阵,对其进行按行翻转,可以左乘矩阵。的起始点分别为旋转前矩阵的右下角和旋转后矩阵的做下角),代码遵循矩阵的乘法规则进行处理(注:和0相乘没有意义)注:将矩阵对称时,注意只需要对称上三角的元素(A和C的坐标是固定的,对于N*N的方阵而言,可由此来计算旋转后各个元素的坐标。不占用额外内存空间能否做到?原创 2025-05-01 09:18:31 · 1138 阅读 · 0 评论 -
L43.【LeetCode题解】转置矩阵(C语言)
则可以推出:returnSize是返回矩阵的行数, *returnColumnSizes数组存储返回矩阵的每一行元素的个数(即列数)可以得出:matrixSize是矩阵的行数,矩阵第i行的元素个数为matrixColSize[i](i从0开始算)calls free(),即假定调用者调用了free(),transpose函数是被调用者调用的。注意不用写free(),LeetCode上注释写着:assume。是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。给你一个二维整数数组。原创 2025-04-30 13:05:20 · 319 阅读 · 0 评论 -
CC50.【C++ Cont】滑动窗口
right从左边界向后枚举,right每指向一个新数,就为sum加上这个新数(思想类似前缀和,比方法1每次循环重新计算一遍sum要快)此时sum>target,记录len的值:right-left+1==4,但这个len不一定是最小值,因此要继续"滑动"窗口。left++,为"出窗口"(移除旧数据)sum减去对应的值,注意right不用回退,要利用。给定闭区间[left,right],left为区间左边界,right为区间的右边界。如果sum<target,right++,为"进窗口"(原创 2025-04-29 20:13:50 · 1057 阅读 · 0 评论 -
L22.5.【LeetCode题解】环形链表(返回环的入口点 方法2)
给定一个链表,返回链表开始入环的第一个节点。从链表的头节点开始沿着。指针进入环的第一个节点为环的入口节点。如果链表无环,则返回。来表示链表尾连接到链表中的位置(索引从 0 开始)。之后断开相遇点与后一个节点之间的链接(设相遇节点为meet,即。这就转换成了相交链表问题,求出相交节点的地址即可。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。为了表示给定链表中的环,我们使用整数。返回索引为 1 的链表节点。返回索引为 0 的链表节点。,则在该链表中没有环。原创 2025-04-25 18:58:20 · 558 阅读 · 0 评论 -
L42.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且的四元组bcd你可以按返回答案。原创 2025-04-18 09:49:58 · 1040 阅读 · 0 评论 -
L41.【LeetCode题解】三数之和(双指针思想)
使用左右指针left和right来移动,如果满足题目条件,就将{nums[left],nums[right],nums[bound]}尾插到类型为vector<vector<int>> 的ret中。显然需要去重,right前后都是-1,需要跳过重复的情况,可以比较right前后的值是否相同,使用循环来跳过所有重复的情况,因为。的情况下且至少有两个三元组的元素相同时,需要去重,前提是和为0,如果>0或<0,不需要去重。例如给定以下数组[-1,0,1,2,1,-4],排过序后为[-4,-1,0,1,1,2]原创 2025-04-16 14:26:29 · 1235 阅读 · 0 评论 -
L40.【LeetCode题解】查找总价格为目标值的两个商品(剑指offer:和为s的两个数字) (双指针思想,内含详细的优化过程)
购物车内的商品价格按照升序记录于数组price。请在购物车中找到两个商品的价格总和刚好是target。若存在多种情况,返回任一结果即可。[3,15] 或者 [15,3][27,34] 或者 [34,27]原创 2025-04-12 19:36:43 · 1023 阅读 · 0 评论 -
L39.【LeetCode题解】有效三角形的个数 (双指针思想)
left向右移动时,均满足nums[left]+nums[right]==2+9>nums[bound]变化的,因此当nums[i]+nums[j]>nums[k]时,提前结束对k的循环,节省时间。以排过序的数组{2,2,3,4,5,9,10}为例,bound从右向左移动,三层循环,枚举所有三条边的组合,满足"任意两边之和大于第三边",计数器++先对数组排序,之后使用原来的三重循环,只不过在一个一个枚举的时候,(注:虽然2,3,4是重复的,但仍然要计入)2,3,4 (使用第一个 2)原创 2025-04-11 14:16:36 · 685 阅读 · 0 评论 -
L38.【LeetCode题解】盛最多水的容器 (双指针思想)
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。你不能倾斜容器。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1。原创 2025-04-07 21:50:13 · 876 阅读 · 0 评论 -
L37.【LeetCode题解】快乐数(双指针思想)
本题n的类型为int,而int类型的最大值为2147483647,process(2147483647)==260,则给定任意一个。n,process(n)的结果在[1,260],则经过261次运算,至少有两次process执行的结果是相同的,因此结果是循环的。,再判断"快数"和"慢数"相遇的值即可("快数"和"慢数"选任何一个判断其值),如果为1,为快乐数,反之不是快乐数。设"快数"为fast,慢数为slow,初始值都为n,"快数"一次循环变化两次,"慢数"一次循环变化一次,,没有其他不循环的情况。原创 2025-04-05 10:42:40 · 484 阅读 · 0 评论 -
L36.【LeetCode笔记】循环队列(链表解法)
发现四个选项都有%maxsize,解释maxsize:循环队列的总空间,例如当maxsize==5时,最多只能存4个元素,要留下一个空间来判断空和满。是正确的,如果为ring.end+1 == ring.front,则在第1、2步时会出问题(注意:第1~4步包含了front和end所有可能的取值,,在上方代码的myCircularQueueRear函数中,rear指向尾节点的下一个节点,// 返回 true。// 返回 true。文章中提到过数组的解法,链表解决的思想也在那篇文章中,本文写写链表的代码。原创 2025-03-15 09:57:07 · 872 阅读 · 0 评论 -
L35.【LeetCode题解】循环队列(数组解法)
队列不为空时,删除元素:当front==k时,再插入元素时front++,之后处理越界的front,使其等于0,则,front==(front+1)%(k+1)队列未满时,插入元素:当rear==k时,再插入元素时rear++,之后处理越界的rear,使其等于0,则,rear==(rear+1)%(k+1)要访问循环队列的头和尾,需要两个指针front(头指针)和rear(尾指针),初始状态下,链表为空时,front和rear都指向同一个节点。// 返回 true。// 返回 true。原创 2025-03-06 09:04:07 · 1027 阅读 · 0 评论 -
L34.【LeetCode题解】随机链表的复制(复杂链表的复制)
给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的。深拷贝应该正好由n个节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。。例如,如果原链表中有X和Y两个节点,其中。那么在复制链表中对应的两个节点x和y,同样有。返回复制链表的头节点。用一个由n个节点组成的链表来表示输入/输出中的链表。原创 2025-02-14 10:28:01 · 963 阅读 · 1 评论 -
L9.【LeetCode题解】分割链表(三种方法)
比x小的放到一个链表,比x大的放到另外一个链表,最后将这两个链表与x合并为一个链表,返回头节点的地址.为了避免尾插时找尾,为两个链表定义各自的尾指针。设p1找大值,p2找小值,注意:一开始要让p1和p2都要指向同一个节点,且节点的值。★注:示例1画的图其实是错的,最后的结果应该是1->2->2->,这样后面才容易换,之后p2先出发找小,与p1交换才能让。的节点之前",因此就要通过交换两个指针指向的值来让。的节点之前"显然是数据分块问题,可以在。给你一个链表的头节点。带哨兵位的新链表进行。原创 2025-02-09 09:46:32 · 986 阅读 · 0 评论 -
L33.【LeetCode题解】轮转数组
2.临时开辟的空间需要用malloc(可以不用判断是否成功开辟),结束后养成良好的习惯,用free函数销毁,再将指针置空。k次那就逆置k次,即可以写一个reverse函数,再调用reverse函数k次(即覆盖k次),注意是闭区间,元素个数为(numsSize-1)-(numsSize-k)+1,其余同理。先前(n-k)个逆置,再后k个逆置,最后整体(n个)逆置。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],耗时太长,不建议使用,其实可以用空间换时间。原创 2025-02-03 09:43:48 · 619 阅读 · 0 评论 -
L32.【LeetCode笔记】设计链表
你可以选择使用单链表或者双链表,设计并实现自己的链表。val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从开始。实现index-1valvalvalindexindexindexindex// 链表变为 1->2->3// 返回 2// 现在,链表变为 1->3// 返回 3getaddAtHeadaddAtTailaddAtIndex2000。原创 2025-01-31 08:54:44 · 864 阅读 · 0 评论 -
L31.【LeetCode题解】丢失的数字
(3^0^1)^(0^1^2^3)==(0^0)^(1^1)^(3^3)^2==2,恰为需要求的数字。请编写代码找出那个缺失的整数。并不意味着运行次数为N,运行次数的的通用表达式为kN+c(这里的k和c均为常数)有点像,但并没有出现成对这个条件,为了创造这个条件,可以另外设0~n数字。去异或,即(3^0^1)^(0^1^2^3),由于异或满足交换律,则。但无论排序方式和查找方式怎么组合,均不符合时间复杂度为。以[3,0,1]为例分析,将[3,0,1]与。,快速排序的时间复杂度为。完整的[0,1,2,3]原创 2025-01-23 10:54:31 · 535 阅读 · 0 评论 -
L30.【LeetCode题解】移动零(三种解法)
设一指针ptr,从头到尾遍历数组,发现num[ptr]==0时,执行向前覆盖,尾部填充一个0,但如果只这样写会有问题!移动一次后发现1前面的元素nums[ptr-1]==0,即没有完全移动好1,那么这种情况出现时。:设两个指针prev和cur,当初始prev==0,cur==1时(先排除数组元素。0 --转换--> nums[prev]0 --转换--> nums[prev]0 --转换--> nums[prev]0 :附近没有0,prev和cur都++例如测试数据[0,0,1,0]原创 2025-01-06 15:18:35 · 909 阅读 · 0 评论 -
L29.【LeetCode笔记】2 的幂(五种解法)
恰为int范围,其中int范围中最大的2的幂数为0x40000000,用0x40000000%n==0。直接将 n 二进制表示的最低位 1 移除,若为2的幂,则运算结果为0。1.作用:log函数默认以e为底,则log(x)返回的是。,请你判断该整数是否是 2 的幂次方。2的幂的二进制数的特点:只有一个位为1,其余全为0。将log(0)改为log(-1)再运行。直接获取 n 二进制表示的最低位的 1。如果n(n>0)为2的幂,一定满足。2.参数x的重要提示:x必须大于0。其实可以直接返回逻辑运算的结果。原创 2025-01-04 15:14:46 · 770 阅读 · 0 评论 -
L28.【LeetCode题解】 统计好三元组
直译题目,显然三个循环,最内侧的循环写if判断,写三个条件abs(arr[i]-arr[j])原创 2025-01-01 22:19:44 · 353 阅读 · 0 评论 -
L27.【LeetCode题解】 三步问题的四种解法(含矩阵精彩解法!)
可以看看报错的数字:当n==61时,"2082876103 + 1748130326"相加溢出了,可以设想2082876103和1748130326产生的原因,n==某个数溢出了,可以使程序溢出的n的临界值。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。1000000007,由于d=a+b+c,则程序的计算顺序为:先算a+b,后算+c,则应该对(a+b)先模1000000007再+c,再对d模一次。虽然代码中返回值写成c%1000000007,但是没有完全领会题目的意思,原创 2024-12-30 08:08:46 · 1656 阅读 · 0 评论 -
L26.【LeetCode笔记】 杨辉三角
给定一个非负整数 numRows生成「杨辉三角」的前 numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。[[1]]原创 2024-12-20 18:36:58 · 951 阅读 · 0 评论 -
L25.【LeetCode题解】验证回文串(剖析几种解法)
给定一个字符串s,验证s是否是,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的。s =true"amanaplanacanalpanama" 是回文串false解释:"raceacar" 不是回文串s。原创 2024-12-12 09:20:56 · 692 阅读 · 0 评论 -
L24.【LeetCode笔记】相交链表(新版)
假设A链表为长链表(longlis接收),B链表为短链表(shortlist接收),如果假设不成立,再更正(修改longlist和shortlist),这样就不用做if{...}else{...}了,减少重复代码。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。将A链表的每个节点的地址和B链表的所有节点的地址进行比较,如果相等则可求出相交节点的地址。原创 2024-12-10 15:11:29 · 1078 阅读 · 0 评论 -
L23.【LeetCode题解】环形链表(返回环的入口点 方法1)
给定一个链表,返回链表开始入环的第一个节点。从链表的头节点开始沿着next指针进入环的第一个节点为环的入口节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果pos是-1,则在该链表中没有环。pos不允许修改给定的链表。返回索引为 1 的链表节点链表中有一个环,其尾部连接到第二个节点。返回索引为 0 的链表节点链表中有一个环,其尾部连接到第一个节点。返回 null链表中没有环。[0, 104]-1是否可以使用。原创 2024-12-09 20:29:37 · 1092 阅读 · 0 评论 -
L22.【LeetCode题解】用栈实现队列(方法2)(★详解★)
对于"push 1->push 2->push 3->push 4->pop->pop->push 5->push 6->->pop->pop->pop"过程画图分析。和myQueuePop类似,返回popst的栈顶元素,如果popst为空,则将需要将pushst的数据拿过来。这里要分类讨论,由"过程详解"可知,要判断栈popst是否为空,如果为空,需要将pushst的数据(按队列的性质,需要pop 1,则需要将2,3,4拿出放到另一个栈中。按队列的性质,需要pop 2,此时直接对右侧栈pop。原创 2024-12-07 20:38:04 · 896 阅读 · 0 评论 -
L21.【LeetCode题解】用栈实现队列(方法1)
画图分析push 1 --> push 2 --> push 3 --> push 4 --> pop 1。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(注意在STPop函数的设计与QueuePop的设计有所不同,最后还要把数据挪动回来(否则只能通过部分的测试用例。文章代码的结构写一个。原创 2024-12-06 20:04:11 · 576 阅读 · 0 评论