算法学习专栏
文章平均质量分 63
算法学习专栏
水蓝烟雨
个人知识库 : https://www.yuque.com/apple-pie 丨邮箱 : yaeovoi@163.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[堆栈基础] LCR 123. 图书整理 I
要求:从尾到头反过来返回每个节点的值(用数组返回)。给定一个链表的头节点。原创 2025-01-02 08:00:00 · 509 阅读 · 0 评论 -
[堆栈基础] 0150. 逆波兰表达式求值
逆波兰表达式的计算遵循从左到右的规律。我们在计算逆波兰表达式的值时,可以使用一个栈来存放当前的操作数,从左到右依次遍历逆波兰表达式,计算出对应的值。逆波兰表达式,也叫做后缀表达式,特点是:没有括号,运算符总是放在和它相关的操作数之后。这道题是栈的典型应用。我们先来简单介绍一下逆波兰表达式。,表示「逆波兰表达式」。:给定一个字符串数组。原创 2025-01-01 14:13:55 · 573 阅读 · 0 评论 -
[堆栈基础] 0739. 每日温度
题目的意思实际上就是给定一个数组,每个位置上有整数值。对于每个位置,在该位置右侧找到第一个比当前元素更大的元素。求「该元素」与「右侧第一个比当前元素更大的元素」之间的距离,将所有距离保存为数组返回结果。最简单的思路是对于每个温度值,向后依次进行搜索,找到比当前温度更高的值。:输出一个列表,列表上每个位置代表「如果要观测到更高的气温,至少需要等待的天数」。如果之后的气温不再升高,则用。更好的方式使用「单调递增栈」,栈中保存元素的下标。原创 2025-01-01 14:12:56 · 361 阅读 · 0 评论 -
[堆栈基础] 0232. 用栈实现队列
仅使用两个栈实现先入先出队列。原创 2025-01-02 07:00:00 · 300 阅读 · 0 评论 -
[堆栈基础] 0155. 最小栈
要求能在常数时间内实现。原创 2024-12-31 08:00:00 · 309 阅读 · 0 评论 -
[堆栈基础] 1047. 删除字符串中的所有相邻重复项
比如 “abbaca”。先删除相邻且相同的字母 “bb”,变为 “aaca”,再删除相邻且相同的字母 “aa”,变为 “ca”,无相邻且相同的字母,即 “ca” 为最终结果。跟括号匹配有点类似。我们可以利用「栈」来做这道题。遍历字符串,如果当前字符与栈顶字符相同,则将栈顶所有相同字符删除,否则就将当前字符入栈。给一个全部由小写字母组成的字符串 S,重复的删除相邻且相同的字母,直到相邻字母不再有相同的。原创 2024-12-31 07:00:00 · 539 阅读 · 0 评论 -
[堆栈基础] 0394. 字符串解码
给定一个经过编码的字符串。经过解码之后的字符串。原创 2025-01-03 07:00:00 · 404 阅读 · 0 评论 -
[堆栈基础] 0020. 有效的括号
括号匹配是「栈」的经典应用。我们可以用栈来解决这道题。是否有效(即括号是否匹配)。原创 2024-12-31 09:00:00 · 483 阅读 · 0 评论 -
[堆栈基础] LCR 125. 图书整理 II
使用两个栈,inStack 用于输入,outStack 用于输出。:使用两个栈实现先入先出队列。原创 2025-01-02 09:00:00 · 739 阅读 · 0 评论 -
[堆栈基础] 0946. 验证栈序列
要求:如果第一个序列为空栈的压入顺序,而第二个序列。为该栈的压出序列,则返回。,每个序列中的值都不重复。描述:给定两个整数序列。原创 2025-01-03 09:00:00 · 414 阅读 · 0 评论 -
[堆栈基础] 0032. 最长有效括号
找出最长有效(格式正确且连续)括号子串的长度。原创 2025-01-03 08:00:00 · 653 阅读 · 0 评论 -
[堆栈基础] 0227. 基本计算器 II
可以考虑使用一个栈来保存进行乘除运算后的整数值。正整数直接压入栈中,负整数,则将对应整数取负号,再压入栈中。这样最终计算结果就是栈中所有元素的和。计算表达式中,乘除运算优先于加减运算。我们可以先进行乘除运算,再将进行乘除运算后的整数值放入原表达式中相应位置,再依次计算加减。,表达式中所有整数为非负整数,运算符只有。:实现一个基本计算器来计算并返回它的值。:给定一个字符串表达式。原创 2025-01-01 14:11:53 · 453 阅读 · 0 评论 -
[单调栈] 0901. 股票价格跨度
求解小于或等于今天价格的最大连续日」等价于「求出左侧第一个比当前股票价格大的股票,并计算距离」。求出左侧第一个比当前股票价格大的股票我们可以使用「单调递减栈」来做。类,用于收集某些股票的每日报价,并返回该股票当日价格的跨度。例如:如果未来 7 天股票的价格是。原创 2025-01-05 08:00:00 · 553 阅读 · 0 评论 -
[单调栈] 0084. 柱状图中最大的矩形
用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。要求:计算出在该柱状图中,能够勾勒出来的矩形的最大面积。思路三:利用「单调栈」减少两侧延伸的复杂度。给定一个非负整数数组。原创 2025-01-07 15:23:59 · 454 阅读 · 0 评论 -
[单调栈] 0503. 下一个更大元素 II
中每个元素右侧下一个更大的元素。然后将其存储到答案数组中。这种解法的时间复杂度是 O(n)。要求:输出每个元素的下一个更大元素。(最后一个元素的下一个元素是数组的第一个元素)。解题思路是使用单调递增栈。复制一份到末尾,生成长度为。或者通过取模运算将下标映射到。而循环数组的求解方法可以将。原创 2025-01-05 07:00:00 · 318 阅读 · 0 评论 -
[单调栈] 0042. 接雨水
计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。的柱子的高度图,用数组。原创 2025-01-08 07:00:00 · 452 阅读 · 0 评论 -
[单调栈] 0496. 下一个更大元素 I
从哈希表中取出对应结果,存放到答案数组中。这种解法的时间复杂度是 O(n)。中每个元素右侧下一个更大的元素。然后将其存储到哈希表中。的子集,所以我们可以先遍历一遍。:给定两个没有重复元素的数组。,并构造单调递增栈,求出。中的下一个比其大的值。原创 2025-01-04 08:00:00 · 575 阅读 · 0 评论 -
[堆栈基础] 0071. 简化路径
表示指向某一文件或目录的 Unix 风格 绝对路径 (以。:弹出栈顶元素(若存在);请你将其转化为 更加简洁的规范路径。item 为有效值 :存入栈中;返回简化后得到的 规范路径。根据题意,使用栈进行模拟即可。item 为 . :不作处理。原创 2025-01-04 07:00:00 · 303 阅读 · 0 评论 -
[单调栈] 0316. 去除重复字母
去除字符串中重复的字母,使得每个字母只出现一次。需要保证 「返回结果的字典序最小(要求不能打乱其他字符的相对位置)」。针对题目的三个要求:去重、不能打乱其他字符顺序、字典序最小。要满足第 3 条需求,我们可以使用 「单调栈」 来解决。之前出现的非重复、并且字典序最小的字符序列。思路 1:哈希表 + 单调栈。原创 2025-01-07 15:24:57 · 561 阅读 · 0 评论 -
[单调栈] 0862. 和至少为K的最短子数组
如果使用两重循环分别遍历子数组的开始和结束位置,则可以直接求出所有满足条件的子数组,以及对应长度。此时问题就转变为:是否能找到满足 i>j 且 pre‾sum[i]−pre‾sum[j]≥k 两个条件的子数组 [j,i)?对于区间 [left,right],通过 pre‾sum[right+1]−prefix‾cnts[left] 即可快速求解出区间 [left,right] 的子数组和。如果不存在这样的子数组,返回 −1。首先对于子数组和,我们可以使用「前缀和」的方式,方便快速的得到某个子数组的和。原创 2025-01-08 08:00:00 · 1370 阅读 · 0 评论 -
[数组滑动窗口] 1438. 绝对差不超过限制的最长连续子数组
求最长连续子数组,可以使用滑动窗口来解决。这道题目的难点在于如何维护滑动窗口内的最大值和最小值的差值。遍历滑动窗口求最大值和最小值,每次计算的时间复杂度为 O(k),时间复杂度过高。考虑使用特殊的数据结构来降低时间复杂度。可以使用堆(优先队列)来解决。要求:返回最长连续子数组长度,子数组中的任意两个元素之间的绝对差必须小于或者等于。如果不存在满足条件的子数组,则返回。,和一个表示限制的整数。原创 2024-12-10 08:00:00 · 308 阅读 · 0 评论 -
[数组滑动窗口] 1658. 将 x 减到 0 的最小操作数
使用 max‾len维护和等于 target的最长连续子数组长度。然后用滑动窗口 window‾sum来记录连续子数组的和,设定两个指针:left、right,分别指向滑动窗口的左右边界,保证窗口中的和刚好等于 target。将 x 减到 0 的最小操作数可以转换为求和等于 sum(nums)−x的最长连续子数组长度。我们可以维护一个区间和为 sum(nums)−x的滑动窗口,求出最长的窗口长度。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。原创 2024-12-07 07:00:00 · 450 阅读 · 0 评论 -
[数组滑动窗口] 1208. 尽可能使字符串相等
将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 ∣s[i]−t[i]∣ 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。:如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。分别指向滑动窗口的左右边界,保证窗口内所有元素转化开销总和小于等于 maxCost。原创 2024-12-08 08:00:00 · 455 阅读 · 0 评论 -
[链表基础] 0083. 删除排序链表中的重复元素
删除所有重复的元素,使每个元素只出现一次。:给定一个已排序的链表的头 head。原创 2024-12-11 07:00:00 · 341 阅读 · 0 评论 -
[链表基础] 0206. 反转链表
将该单链表进行反转。可以迭代或递归地反转链表。:给定一个单链表的头节点。原创 2024-12-11 09:00:00 · 553 阅读 · 0 评论 -
[数组滑动窗口] 0904. 水果成篮
个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。的滑动数组,求窗口中最大的水果树数目。要求:返回你能收集的水果树的最大总量。个篮子,要求在连续子数组中装最多。可以理解为维护一个水果种类数为。原创 2024-12-09 09:00:00 · 400 阅读 · 0 评论 -
[数组滑动窗口] 1358. 包含所有三种字符的子字符串数目
同时存在的子字符串,则在该子字符串后面追加字符构成的新字符串还是满足题意的。假设该子串末尾字母的位置为。同时存在的最短子串,并记录所有满足题意的字符串数量。,分别指向滑动窗口的左右边界,保证窗口中不超过。都至少出现过一次的子字符串数目。都至少出现过一次的子字符串数目。,则以此字符串构建的新字符串有。所以题目可以转换为找出。来记录各个字符个数,原创 2024-12-10 07:00:00 · 1114 阅读 · 0 评论 -
[链表基础] 0082. 删除排序链表中的重复元素 II
这道题的题意是需要保留所有不同数字,而重复出现的所有数字都要删除。因为给定的链表是升序排列的,所以我们要删除的重复元素在链表中的位置是连续的。所以我们可以对链表进行一次遍历,然后将连续的重复元素从链表中删除即可。:删除原始链表中所有重复数字的节点,只留下不同的数字。:给定一个已排序的链表的头 head。原创 2024-12-11 08:00:00 · 427 阅读 · 0 评论 -
[链表基础] 0707. 设计链表
指针的链表节点类, 然后按照要求对节点进行操作。原创 2024-12-10 09:00:00 · 438 阅读 · 0 评论 -
[数组滑动窗口] 1695. 删除子数组的最大得分
给定一个正整数数组 nums,从中删除一个含有若干不同元素的子数组。题目要求的是含有不同元素的连续子数组最大和,我们可以用滑动窗口来做,维护一个不包含重复元素的滑动窗口,计算最大的窗口和。删除子数组的「得分」就是子数组各元素之和。:返回只删除一个子数组可获得的最大得分。原创 2024-12-08 07:00:00 · 432 阅读 · 0 评论 -
[链表基础] 0092. 反转链表 II
但是需要注意一点,如果需要反转的区间包含了链表的第一个节点,那么我们可以事先创建一个哑节点作为链表初始位置开始遍历,这样就能避免找不到需要反转的链表区间的前一个节点。」中我们可以通过迭代、递归两种方法将整个链表反转。这道题而这道题要求对链表的部分区间进行反转。我们同样可以通过迭代、递归两种方法将链表的部分区间进行反转。我们可以先遍历到需要反转的链表区间的前一个节点,然后对需要反转的链表区间进行迭代反转。最后再返回头节点即可。的链表节点,返回反转后的链表。:给定单链表的头指针。原创 2024-12-14 13:18:49 · 603 阅读 · 0 评论 -
[数组滑动窗口] 0424. 替换后的最长重复字符
但是这种暴力求法中,枚举子串的时间复杂度为 O(n2),统计出现次数最多的字符和替换字符时间复杂度为 0(n),且两者属于平行处理,总体下来的时间复杂度为 O(n3)。可以将任意位置上的字符替换成另外的大写字母,最多可替换 k 次。:给定一个仅由大写英文字母组成的字符串 s,以及一个整数 k。:在进行上述操作后,找到包含重复字母的最长子串长度。原创 2024-12-07 08:00:00 · 475 阅读 · 0 评论 -
[数组滑动窗口] 0795. 区间子数组个数
那么现在的问题就变为了如何计算最大元素小于等于。每次遍历完将有效子数组数量累加到答案中。的子数组个数」也可以转变为「最大元素小于等于。累加,表示在此位置上结束的有效子数组数量为。的连续元素数量,遍历一遍数组,如果遇到。求连续、非空且其中最大元素满足大于等于。的子数组个数 = 最大元素小于等于。的子数组个数 - 最大元素小于。给定一个元素都是正整数的数组。最大元素满足大于等于。原创 2024-12-09 08:00:00 · 179 阅读 · 0 评论 -
[数组滑动窗口] 1004. 最大连续1的个数三
给定一个由 0、1 组成的数组 nums,再给定一个整数 k。最多可以将 k 个值从 0 变到 1。:返回仅包含 1 的最长连续子数组的长度。思路 1:滑动窗口(不定长度)原创 2024-12-06 09:00:00 · 479 阅读 · 0 评论 -
[数组滑动窗口] 1493. 删掉一个元素以后全为 1 的最长子数组
设定两个指针:left、right,分别指向滑动窗口的左右边界,保证窗口 0 的个数小于 1 个。使用 window‾count记录窗口中 0 的个数, ans 记录删除一个元素后,最长的只包含 1 的非空子数组长度。维护一个元素值为 0 的元素数量少于 1 个的滑动窗口。则答案为滑动窗口长度减去窗口内 0 的个数求最大值。:返回最长的且只包含 1 的非空子数组的长度。如果不存在这样的子数组,请返回 0。:给定一个二进制数组 nums,需要从数组中删掉一个元素。原创 2024-12-09 07:00:00 · 584 阅读 · 0 评论 -
[链表基础] 0203. 移出链表元素
需要注意的是:因为要删除的节点可能包含了头节点,我们可以考虑在遍历之前,新建一个头节点,让其指向原来的头节点。这样,最终如果删除的是头节点,则直接删除原头节点,然后最后返回新建头节点的下一个节点即可。的节点,并返回新的链表头节点。:给定一个链表的头节点。原创 2024-12-14 17:30:00 · 295 阅读 · 0 评论 -
[链表基础] 0061. 旋转链表
先遍历一遍,求出链表节点个数 n。注意到 k 可能很大,我们只需将链表右移 k % n 个位置即可。第二次遍历到 n - k % n 的位置,记录下断开后新链表头节点位置,再将其断开并返回新的头节点。给定一个链表和整数 k,将链表每个节点向右移动 k 个位置。我们可以将链表先连成环,然后将链表在指定位置断开。原创 2024-12-16 08:00:00 · 307 阅读 · 0 评论 -
[链表双指针] 0876. 链表的中间结点
使用步长不一致的快慢指针进行一次遍历找到链表的中间节点。:返回链表的中间节点。如果有两个中间节点,则返回第二个中间节点。:给定一个单链表的头节点。原创 2024-12-29 08:00:00 · 431 阅读 · 0 评论 -
[链表双指针] LCR 140. 训练计划 II
步,然后快慢指针、慢指针再同时走,每次一步,这样等快指针遍历到链表尾部的时候,慢指针就刚好遍历到了倒数第。常规思路是遍历一遍链表,求出链表长度,再遍历一遍到对应位置,返回该位置上的节点。如果用一次遍历实现的话,可以使用快慢指针。返回该该位置上的节点即可。给定一个链表的头节点。要求返回链表的倒数第。原创 2024-12-29 09:00:00 · 372 阅读 · 0 评论 -
[链表双指针] 0445. 两数相加 II
链表中最高位位于链表开始位置,最低位位于链表结束位置。这与我们做加法的数位顺序是相反的。为了将链表逆序,从而从低位开始处理数位,我们可以借用两个栈:将链表中所有数字分别压入两个栈中,再依次取出相加。来代表两个非负整数。数字最高位位于链表开始位置。每个节点只储存一位数字。同时,在相加的时候,还要考虑进位问题。要求:将这两个数相加会返回一个新的链表。之外,这两个链表代表的数字都不会以。给定两个非空链表的头节点。原创 2024-12-30 09:00:00 · 410 阅读 · 0 评论
分享