- 博客(35)
- 收藏
- 关注
原创 LeetCode热题100——234.回文链表(两种解法)
遍历链表一次 O(n),双指针遍历数组一次 O(n/2) ≈ O(n)。找中点 O(n),反转链表 O(n),比较 O(n),整体 O(n)。将链表中的数值复制到一个数组中,然后使用双指针从两端向中间比较即可。3.同时遍历前半部分和反转后的后半部分,比较对应节点的值是否相等。只使用了若干个指针变量,没有使用额外的数组或递归栈。,请你判断该链表是否为回文链表。使用一个与链表长度相同的数组存储所有节点的值。找到链表的中间节点(前半部分的尾节点)。给你一个单链表的头节点。
2026-04-28 21:02:00
632
原创 LeetCode热题100——206.反转链表(迭代法)
3.返回新头节点:循环结束后,pre 指向原链表的最后一个节点,即反转后的新头节点,返回 pre。1.初始化:pre = NULL,cur = head。,请你反转链表,并返回反转后的链表。
2026-04-27 20:45:33
253
原创 LeetCode热题100——160.相交链表(两种解法)
因此,我们可以利用哈希集合存储其中一个链表的所有节点地址,然后遍历另一个链表,第一个存在于集合中的节点就是相交的起始节点。若两个指针分别从两个链表头指针开始同步前进,当指针走到自己链表的末尾时,转向另一个链表的头部继续走,直到走到相交点。两个链表如果相交,它们从相交节点开始到末尾的节点是完全相同的。4.若遍历完链表 headB 仍未找到,则两个链表不相交,返回 NULL。链表相交的定义是:两个链表从某个节点开始,后续的所有节点。4.循环结束后,pa(或 pb)即为相交节点,返回。给你两个单链表的头节点。
2026-04-23 23:37:26
508
原创 Acwing算法基础课——845.八数码(BFS)
现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。在一个 3×3 的网格中,1∼8 这 8 个数字和一个。与其上、下、左、右四个方向之一的数字交换(如果存在)。先后与右、下、右三个方向的数字交换成功得到正确排列。恰好不重不漏地分布在这 3×3 的网格中。输入占一行,将 3×3 的初始网格描绘出来。输出占一行,包含一个整数,表示最少交换次数。如果不存在解决方案,则输出 −1。例如,示例中图形就可以通过让。在游戏过程中,可以把。
2026-04-23 14:23:52
489
原创 Acwing算法基础课——844.走迷宫(BFS)
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。输出一个整数,表示从左上角移动至右下角的最少移动次数。
2026-04-22 22:36:20
422
原创 Acwing算法基础课——843.n-皇后问题(DFS)
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。3.当处理完所有格子时,若已放置的皇后数等于 n,则得到一个合法解,输出棋盘。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输出方案的顺序任意,只要不重复且没有遗漏即可。表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。表示某一个位置的方格状态为空,
2026-04-21 21:20:07
165
原创 Acwing算法基础课——842.排列数字(DFS)
表示当前正在处理排列中的第 0 个位置(下标从 0 开始)。当 u == n 时,说明 0 ~ n-1 共 n 个位置都已填满,得到一个完整排列。否则,依次尝试将 1~n 中未被使用的数字放入当前位置,标记为已使用,然后递归到下一个位置。本题是典型的全排列问题,可以使用深度优先搜索(DFS)+ 回溯解决。给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。如果已经填满了 n 个位置,就输出当前排列并返回。现在,请你按照字典序将所有的排列方法输出。共一行,包含一个整数 n。,以便尝试其他数字。
2026-04-21 19:42:23
125
原创 LeetCode热题100——240.搜索二维矩阵 II(题目+题解+答案)
由于矩阵的每一行都是升序排列的,我们可以利用这一性质,对每一行分别进行二分查找,判断 target 是否存在于该行中。如果区间内存在元素与 value 相等(按比较规则等价),返回 true;否则返回 false。3.若遍历完所有行都没有找到,返回 false。1.获取矩阵的行数 m 和列数 n。中提供的一个二分查找函数,用于在。每行的元素从左到右升序排列。每列的元素从上到下升序排列。编写一个高效的算法来搜索。内快速判断某个值是否存在。
2026-04-17 21:06:20
345
原创 LeetCode热题100——48.旋转图像(题解+答案+要点)
保证了只交换矩阵的下三角(或上三角)元素,避免重复交换。如果写成 j < n,每个元素会被交换两次,等于没做转置。旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。正好得到顺时针旋转 90° 的结果。使用另一个矩阵来旋转图像。
2026-04-17 15:14:08
644
原创 LeetCode热题100——54.螺旋矩阵(题解+答案+要点)
每完成一个方向的遍历,立即收缩对应的边界,并检查是否已经越界。如果越界,则跳出循环。顺时针一圈一圈地遍历矩阵的外围元素,每遍历完一条边就收缩对应的边界,直到所有元素都被访问。,返回矩阵中的所有元素。
2026-04-16 22:40:10
417
1
原创 LeetCode热题100——73.矩阵置零(题目+题解+答案)
标记信息可以用两个布尔数组实现:一个长度为 m 的 row 数组,row[i] = true 表示第 i 行需要清零;另一个长度为 n 的 col 数组,col[j] = true 表示第 j 列需要清零。如果 matrix[i][0] == 0 或 matrix[0][j] == 0,则把 matrix[i][j] 设为 0。遍历一次矩阵,记录下所有0元素所在的行号和列号,然后第二次遍历时,只要当前位置的行号或列号被标记过,就把该位置置为0。,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2026-04-16 21:19:42
895
原创 LeetCode热题100——41.缺失的第一个正数(题解+答案+要点)
将数组所有的数放入哈希表,随后从 1 开始依次枚举正整数,并判断其是否在哈希表中。如果数组长度为 n,那么最理想的情况是 1,2,3,...,n 全部出现,此时缺失的是 n+1。:把所有不在 [1, n] 范围内的数字改成 n+1(一个无意义的“大数”)。,因为前面的标记可能已经把某些位置变成了负数,但我们要读的是原始数字的值。对于 ≤0 或 >n 的数字,它们不可能成为“最小的缺失正整数”如果缺少某个 1~n 之间的数,那么它一定小于 n+1。:扫描数组,第一个正数所在的下标就是缺失的最小正整数。
2026-04-15 23:30:56
466
原创 LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
我们可以先遍历一次数组,计算出每个位置左边所有元素的乘积(前缀积),再遍历一次计算右边所有元素的乘积(后缀积),最后将两者相乘即得到结果。这种方法避免了除法,并且只需要线性扫描三次。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。
2026-04-15 21:57:02
756
原创 LeetCode热题100——189.轮转数组(题解+答案+要点)
反转整个数组 → 后 k 个元素跑到了前 k 个位置,但顺序是反的。反转前 k 个元素 → 将前 k 个元素恢复正确顺序。反转后 n-k 个元素 → 将剩余元素恢复正确顺序。向右轮转 1 步:[7,1,2,3,4,5,6]向右轮转 2 步:[6,7,1,2,3,4,5]向右轮转 3 步:[5,6,7,1,2,3,4]向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。向右旋转 3 步后得到。
2026-04-14 14:59:14
242
原创 LeetCode 热题 100——56.合并区间(题目+题解+答案)
如果当前区间的左端点小于等于结果中最后一个区间的右端点,说明两个区间有重叠,此时更新结果中最后一个区间的右端点为两者右端点的最大值;这样我们就能从左到右依次处理,保证每次遇到的区间要么与已合并的区间重叠,要么开启一个新的不重叠区间。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。区间 [1,4] 和 [4,7] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。
2026-04-14 14:15:25
268
原创 LeetCode热题100——53.最大子数组和(题解+答案+要点)
请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。,初始设为数组的第一个元素(不能设为 0,详见下文的要点)。连续子数组 [4,-1,2,1] 的和最大,为 6。同时,每走一步,都记录下目前为止见到的最大和。如果数组全是负数,比如。(注意:必须包含当前元素)是数组中的一个连续部分。,最大子数组和应该是。,会错误地返回 0。
2026-04-13 17:08:23
237
原创 LeetCode热题100——76.最小覆盖子串(题目+题解+答案)
最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。缩小窗口,并更新最短覆盖子串的边界。通过以上步骤,可以枚举出所有可能的覆盖子串,并记录其中最短的一个。),检查窗口内字符数是否都满足需求。仍为 -1(即从未更新过),说明不存在覆盖子串,返回。t 中两个字符 'a' 均应包含在 s 的子串中,中的所有字符(即窗口内每个字符的出现次数 ≥。因此没有符合条件的子字符串,返回空字符串。每次循环向右移动一步,将新字符加入窗口。向右移动,并将移出的字符从。,将字符加入窗口,直到窗口。
2026-04-12 15:19:29
417
原创 LeetCode 热题100——42.接雨水(题目+题解+答案)
如果这个差值为负数,说明该位置无法存水(柱子本身高于两侧),此时取 0(实际代码中通过 min - height[i] 自然得到非负值,因为 min一定 ≥ height[i])。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。(2)计算 rightMax:[3,3,3,3,3,3,3,3,2,2,2,1](1)计算 leftMax:[0,1,1,2,2,2,2,3,3,3,3,3]左边的最高柱子(包括自己)。
2026-04-12 14:27:32
539
原创 LeetCode 热题 100——239.滑动窗口最大值(题目+题解+答案)
从队尾弹出所有比当前元素小的值(因为它们不可能成为后续窗口的最大值),再将当前元素下标入队。存储数组下标,保证队列中的下标对应的数值是严格递减的。这样队首元素始终是当前窗口的最大值。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。:如果队首下标已经滑出窗口(即下标 ≤ i-k ,则从队首弹出。滑动窗口的位置 最大值。:对于每个完整窗口,队首对应的值即为当前窗口最大值。滑动窗口每次只向右移动一位。
2026-04-04 07:33:16
179
原创 LeetCode 热题100——560.和为K的子数组
如果先插入当前 pre,当 k == 0 时,pre - k == pre,就会错误地将当前子数组(长度为 0)也算进去,导致多计数。当 pre == k 时,pre - k = 0,此时需要从哈希表中取出 0 的个数。这就变成了:当我们走到某个位置(算出当前前缀和 pre)时,只要看看 之前有没有出现过前缀和等于 pre - k,如果有,则有多少个这样的前缀,就找到多少个子数组。把问题转化一下:我们要找和为 k 的子数组,即:前 r+1 个数的和 - 前 l 个数的和 = k。
2026-04-03 18:00:46
371
原创 LeetCode 热题100——11.盛最多水的容器
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。如果移动较短的那条边,虽然宽度也减小,但可能遇到更高的边,让高度增加,从而有机会获得更大的面积。如果移动较长的那条边,宽度减小,但高度最多还是原来的短边(不会变高),所以面积只会更小。木桶效应:一个木桶能装多少水取决于木桶最短的边。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。,是唯一可能让面积变大的做法。返回容器可以储存的最大水量。
2026-04-03 00:00:56
388
原创 LeetCode 热题100——438.找到字符串中所有字母异位词
普通数组名 int[26] 比较时退化为指针,比较的是地址而非内容,无法直接判断两个数组是否相等。由于字符串只包含小写字母,可以用长度为26的数组来记录每个字母出现的次数。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
2026-04-02 21:43:08
922
原创 LeetCode 热题100——49.字母异位词分组
1.创建一个哈希表 unordered_map<string, vector<string>> mp,键为排序后的字符串,值为原始字符串的列表。两个字符串是字母异位词,当且仅当它们排序后的结果完全相同。例如 "eat" 和 "tea" 排序后都是 "aet"。5.遍历哈希表,将每个 vector<string>(即一组字母异位词)加入到结果 ans 中。给你一个字符串数组,请你将 字母异位词 组合在一起。是字母异位词,因为它们可以重新排列以形成彼此。是字母异位词,因为它们可以重新排列以形成彼此。
2026-04-02 20:51:03
158
原创 LeetCode 热题100——3.无重复字符的最长子串
现在 hash 为 {'b','c'},count('a') == 0,退出 while。现在 hash 为 {'b','c'},count('b') == 1,继续 while。hash 为 {'c','a'},count('b') == 0,退出。hash 为 {'a','b'},count('c') == 0,退出。删除 s[left],即 s[0] = 'a',hash 变为 {'b','c'}删除 s[left],即 s[1] = 'b',hash 变为 {'c','a'}
2026-04-01 22:12:56
774
原创 LeetCode 热题100——128.最长连续序列
1.易想到排序,但是本题是不能排序的,因为排序的时间复杂度是 O(nlogn),不符合题目 O(n) 的要求。num_set.count(3) → true(因为 3 在集合中),所以 4 不是起点,直接跳过。false,循环结束。当前序列长度 = 1,maxlen = max(0, 1) = 1。num_set.count(2) → true,3 不是起点,跳过。num_set.count(1) → true,2 不是起点,跳过。长度 = 1,maxlen = max(1, 1) = 1。
2026-04-01 21:35:19
384
原创 LeetCode 热题100——1.两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。[0,1]因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。[1,2][0,1]
2026-03-31 23:20:42
345
原创 LeetCode 热题 100——15.三数之和
break 提前终止循环:因为数组已从小排序,一旦 nums[i] > 0,后面的所有数都大于等于 nums[i],三数之和必然大于 0,无需继续。当 sum == 0 时,找到一组解,加入结果后移动两个指针,并跳过与当前 j、k 相等的元素,防止重复。内层找到解后,先移动 j 和 k 各一步,再跳过重复,这样既能保证不遗漏,也能避免重复添加。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。continue 跳过重复的 i,避免产生重复三元组。当 sum > 0 时,需要减小和,因此 k--。
2026-03-30 20:57:56
546
原创 Acwing算法基础课——831.KMP字符串
p[2]) → j=1>0,且 s[2]='b',p[2]='b'?= p[3]) → j=2>0,p[3]='a',s[3]='a',相等,条件不成立,跳过。= p[2]) → j=1>0,p[2]='b',s[4]='b',相等,条件不成立,跳过。= p[3]) → j=2>0,p[3]='a',s[5]='a',相等,跳过。
2026-03-30 17:39:36
450
原创 LeetCode 热题 100——283.移动零
指针i遍历数组,当遇到非零元素时,将其与j位置的元素交换,且j++。这样,所有非零元素会按原顺序移到数组前部,零则自动移到末尾。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。使用双指针法原地修改数组,初始时i=0;,编写一个函数将所有。
2026-03-29 14:55:46
441
原创 Acwing算法基础课——数据结构 830.单调栈
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。每个元素只会入栈一次、最多出栈一次,时间复杂度为2n,即O(n)思想:如果a3>=a5,那么a3不会被输出。第二行包含 N 个整数,表示整数数列。第一行包含整数 N,表示数列长度。1≤数列中元素≤10^9。
2026-03-29 11:12:58
182
原创 Acwing算法基础课——数据结构 829. 模拟队列
现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。接下来 M 行,每行包含一个操作命令,操作命令为。所有操作保证合法,即不会在队列为空的情况下进行。操作的查询结果为一个整数,表示队头元素的值。操作都要输出一个查询结果,每个结果占一行。本题较简单,只需记住队列的几个函数即可。第一行包含整数 M,表示操作次数。
2026-03-28 13:20:56
48
原创 Acwing算法基础课——数据结构 828. 模拟栈
现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。接下来 M 行,每行包含一个操作命令,操作命令为。操作的查询结果为一个整数,表示栈顶元素的值。所有操作保证合法,即不会在栈为空的情况下进行。操作都要输出一个查询结果,每个结果占一行。本题较简单,只需记住栈的几个函数即可。第一行包含整数 M,表示操作次数。
2026-03-28 13:07:56
56
原创 Acwing算法基础课——数据结构 827.双链表
题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…4.最后输出遍历时注意初始值是i=r[0] for(int i=r[0];//在第 k 个插入的数左侧插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。因为idx 0和1分别代表了头和尾 第一个插入的数idx=2。
2026-03-25 20:21:32
157
原创 Acwing算法基础课——数据结构 826.单链表
题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。第一行包含整数 M,表示操作次数。共一行,将整个链表从头到尾输出。
2026-03-25 20:21:03
175
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅