
栈&队列
文章平均质量分 51
栈&队列
山顶夕景
互联网大厂AI算法工程师。实践出真知。
展开
-
【LeetCode844】比较含退格的字符串(双栈or双指针)
一、题目提示:1 <= s.length, t.length <= 200s 和 t 只含有小写字母以及字符 ‘#’进阶:可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?二、法一:双栈法如果不考虑用O(1)O(1)O(1)的空间复杂度,很容易想到这种添加,删除的步骤,可以用到栈的入栈和出栈,所以可以用2个栈模拟2条字符串的退格运算:class Solution {public: bool backspaceCompare(string s, s原创 2022-02-18 20:54:15 · 763 阅读 · 0 评论 -
【LeetCode剑指offer49】丑数(小顶堆或DP)
一、题目二、思路求前k大经常用到优先级队列,小顶堆,循环将符合要求的丑数加入小顶堆,取k次堆顶元素即可让堆顶为第k个丑数。而逐个加入丑数即加入2x2x2x、3x3x3x、5x5x5x进入集合(去重)即可。注意这里加入小顶堆的元素不能是int类型,否则会报错overflow(因为next = temp * factor后可能会越界):Line 17: Char 33: runtime error: signed integer overflow: 429981696 * 5 cannot be rep原创 2022-02-05 23:02:05 · 841 阅读 · 0 评论 -
【LeetCode451】根据字符出现频率排序(优先队列)
一、题目二、思路根据词频排序,很容易想到用哈希表统计每个字符的个数,然后排序。对于“求前k个”或“排序”的题目可以使用堆排序,用优先级队列实现最大堆,进行堆排序,堆顶即当前的最大值。因为我们的pair<char, int>的second才是对应字符(first)的词频,需要的是对second进行排序,所以重写cmp。PS:其实vector就能够排序了,不用priority_queue也是可以的。【C++中STL的优先级队列】在C++的stl中有priority_queue优先级队列原创 2022-01-23 20:53:01 · 1125 阅读 · 0 评论 -
【LeetCode225】用2个队列实现栈(辅助队列)
一、题目二、思路队列特点:先进先出;栈特点:先进后出。题目给出2个队列,为了让队列实现栈的“先进后出”:(1)在主队列中进入元素前,可以将主队列中的元素出队,进入辅助队列中(暂存着),(2)然后将主队列进入新元素后;(3)辅助队列中暂存的元素重新回到主队列中。三、代码class MyStack {public: queue<int> q1; queue<int> q2; MyStack() { }原创 2022-01-20 19:19:44 · 1256 阅读 · 0 评论 -
【LeetCode346】数据流中的移动平均值
一、题目给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。示例:MovingAverage m = new MovingAverage(3);m.next(1) = 1m.next(10) = (1 + 10) / 2m.next(3) = (1 + 10 + 3) / 3m.next(5) = (10 + 3 + 5) / 3二、思路就是一个滑动窗口的题目,即每次的next(val)操作都会在原来的基础上加入元素,并且将当前滑动窗口内的元素之和除以窗口原创 2022-01-20 17:00:31 · 1131 阅读 · 0 评论 -
【LeetCode622】设计循环队列
一、题目中等题。提示:所有的值都在 0 至 1000 的范围内;操作数将在 1 至 1000 的范围内;请不要使用内置的队列库。二、思路使用动态数组以便在运行阶段创建需要大小的数组循环队列的实现关键在于isFull()和isEmpty()的实现(可以有不同的初始化和方法)。初始化:front = rear = 0。(1)队列为空:设当front = rear时队列为空。普遍区分循环队空和队满的方法:牺牲一个单元来区分两者,即入队时少用一个队列单元,约定“队头指针在队尾指针的下一个位置原创 2022-01-20 16:29:48 · 832 阅读 · 0 评论 -
【LeetCode316】去除重复字母(单调栈+哈希)
一、题目二、思路先读懂题意,删除重复的字母,得到最小的字符串。如babc,删除重复字母有两种结果bac,abc。abc小于bac,所以答案是abc。遇到一个新字符 如果比栈顶小 并且在新字符后面还有和栈顶一样的 就把栈顶的字符抛弃了。(1)前者的条件即单调栈的步骤(for中带while);可以用哈希表inst统计当前字符是否在栈中。(2)为了满足后者的条件,即如果栈顶元素大于当前遍历到的字符s[i],并且栈顶元素在后面还存在,所以可以放心的pop掉。可以用哈希表cnt统计s中剩余字符的出现次数。原创 2022-01-19 23:55:55 · 716 阅读 · 0 评论 -
【LeetCode496】下一个更大元素 I(单调栈)
一、题目提示:1 <= nums1.length <= nums2.length <= 10000 <= nums1[i], nums2[i] <= 104nums1和nums2中所有整数 互不相同nums1 中的所有整数同样出现在 nums2 中进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?二、思路单调栈就是用于解决 Next Greater Number 问题。单调栈模板如下,首先下面版原创 2022-01-19 16:38:56 · 978 阅读 · 0 评论 -
【LeetCode946】验证栈序列(栈的模拟)
一、题目提示:1 <= pushed.length <= 10000 <= pushed[i] <= 1000pushed 的所有元素 互不相同popped.length == pushed.lengthpopped 是 pushed 的一个排列二、思路利用一个栈,空间复杂度为O(n),根据入栈顺序,模拟出栈的过程,主要判断条件popped[t] == stk.top()即可。。但是还可以优化,不使用栈,明早起来优化。三、代码class Solution {原创 2022-01-16 00:12:42 · 627 阅读 · 0 评论 -
【LeetCode150】逆波兰表达式求值(栈)
一、题目根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。即表达式总会得出有效数值且不存在除数为 0 的情况。提示:1 <= tokens.length <= 104tokens[i] 要么是一个算符("+"、"-"、"*" 或 “/”),要么是一个在范围 [-200, 200] 内的整数逆波兰表达式介绍:逆波兰表达式是一种后缀表达式,所谓后原创 2022-01-15 00:53:45 · 685 阅读 · 0 评论 -
【LeetCode227】基本计算器 II(栈)
一、题目1 <= s.length <= 3∗1053 * 10^53∗105s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内题目数据保证答案是一个 32-bit 整数二、思路(1)首先考虑最简单的情况,只有加减法,如3-4+5,首先给第一个数字加上默认初始化的符号+,即+3-4+5,拆分为+3,-4,+5,依次放入栈中求和即得结果。(2)接着考原创 2022-01-13 23:17:26 · 739 阅读 · 0 评论 -
【LeetCode394】字符串解码(栈)
1.题目2.思路由内向外的解析规则很符合栈的特性,对于内部的数字和字符串就借助辅助栈暂时的push和pop。当 c 为]时,stack 出栈,拼接字符串 res = last_res + cur_multi * res,其中:last_res是上个[到当前[的字符串,例如 “3[a2[c]]” 中的 a;cur_multi是当前[到 ]内字符串的重复倍数,例如 “3[a2[c]]” 中的 2。注意:list赋值给元素时是依次赋值,而非只有第一个元素得到整个list,当然这题append进去栈原创 2021-05-19 00:36:57 · 669 阅读 · 0 评论 -
【LeetCode155】最小栈(借用辅助栈)
1.题目2.思路题目要求在常数时间内找到最小元素——故用空间换时间,即借用辅助栈2,而对于栈1来说:(1)每次元素入栈时,将在此之前的所有的元素的min入栈2(辅助栈)中;(2)每次元素出栈时,将辅助栈(栈2)中的栈顶元素出栈。即将辅助栈2与栈1同步,而辅助栈的栈顶始终代表当前的最小元素。3.代码class MinStack {private: stack<int>s; stack<int>mins;public: /** initial原创 2021-03-02 20:26:16 · 1358 阅读 · 2 评论 -
【LeetCode739】每日温度(单调栈)
1.题目2.思路单调栈,用一个栈装数组下标。遍历一次数组,对应数组元素若大于栈顶元素(如果有元素),则找到答案——当前下标和【栈顶元素所在数组的下标】的差,最后弹栈。单调栈模板stack<int> mono_stk;for (遍历数组)) { while (栈非空 && 栈顶元素大于当前元素) { 更新结果; 栈顶元素出栈; } 入栈;}3.代码class Solution {public:原创 2021-02-14 23:23:55 · 731 阅读 · 0 评论 -
【LeetCode20】有效的括号(栈)
1.题目2.思路对给定的字符串进行遍历,当遇到一个左括号时,后面需要有一个相同类型的括号与其匹配,并且后遇到的左括号要先匹配,所以可以使用一个栈(先进后出,后进先出)。遍历字符串:(1)如果当前字符为左半边括号时,则压入栈中;(2)如果为右半边括号时:——若此时栈空则返回false;——若当前遍历到的元素和栈顶元素恰好匹配成功则完成一个匹配的小目标(只有全部遍历完栈为空才能够返回true),所以这里有三个判断是返回false的,最后记得弹栈(才能继续下一个匹配小目标)。注意:有效字符串原创 2021-01-30 19:57:29 · 815 阅读 · 0 评论 -
【1051】Pop Sequence (stack)
1.题目给出容量max=M的栈,分别把1、2、…、n依次入栈,并给出一些列出栈顺序,判读判断出栈顺序是否合法。2.思路出栈是否合法要满足:(1)能出栈(2)不超过栈的限制容量。思路:模拟,将1~n依次入栈,在入栈中——如果入栈的元素恰好等于出栈序列当前等待出栈的元素,就让栈顶元素出栈,同时把出栈序列当前等待出栈的元素位置标记后移1位。此时只要栈顶元素仍然等于出栈序列当前等待出栈的元素,则持续出栈。(1)初始化栈,读入需要测试的出栈序列。——以bool型变量flag表示出栈序列是否合法,若flag原创 2021-01-13 09:49:27 · 742 阅读 · 0 评论