![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
栈与队列
文章平均质量分 68
栈与队列
辰阳星宇
这个作者很懒,什么都没留下…
展开
-
203、【栈与队列】leetcode ——剑指 Offer II 040. 矩阵中最大的矩形 / 85. 最大矩形:暴力+单调栈(C++/Pyhont版本)
C++Python参考文章:矩阵中最大的矩形原创 2023-04-23 22:56:35 · 399 阅读 · 0 评论 -
193、【栈与队列】leetcode ——面试题 16.26. 计算器(C++版本)
参考文章:双栈算法、面试题 16.26. 计算器(C++ 「栈+辅助栈」【图解】)原创 2023-03-06 21:07:12 · 94 阅读 · 0 评论 -
188、【栈与队列】leetcode ——84. 柱状图中最大的矩形:暴力解法+单调栈(C++/Python版本)
整体思路与 42. 接雨水 相近,区别在于接雨水的时候,单调栈是按从栈底到栈顶单调不增顺序存储,而本题要找到最大勾画面积,可以让每次到达一个比栈顶元素更低的长方体时,触发求面积的计算,也就是每当遇到右边第一个比自己更小的元素时,计算一次。因此,本体可按照单调栈从栈底到栈顶,单调不减的次序存储。采用单调栈的方式,自栈底到栈顶,按照单调不减的次序存储元素。每当第一次遇到比栈顶元素更小的数,则将栈顶元素弹栈,计算高度差和间隔差,得到面积,再和已有结果比较取最大值。注意:由于有可能输入数组会是单调递增数组,那么如果原创 2023-03-01 13:15:43 · 110 阅读 · 0 评论 -
187、【栈与队列】leetcode ——42. 接雨水(C++版本)
用单调栈来存储高度值,当为单调不增时入栈,当遇到的数比栈顶元素大时,就把栈顶元素弹出,计算当前栈顶元素可接的雨水体积。每遍历到一个高度时,就左右寻找探索两侧的边界,然后取二者中的最小值与当前高度相减(取最小值的原因,相当于是一个最短的木桶板决定了它最大可存水量的上界)。因此,寻找二者中的最小高度作为与栈顶元素的高度差,相减求出可接雨水高度。然后,再找出长度与之相乘,就可得到可接的雨水体积,也就是可接雨水个数。存储元素:数组下标,存储次序:从栈底到栈顶,单调不增(包含递减和等于的情况)。原创 2023-02-28 23:09:50 · 80 阅读 · 0 评论 -
186、【栈与队列】leetcode ——503. 下一个更大元素 II(C++版本)
核心思路相同,区别在于本题的数组变为循环数组,第一次遍历到前n个未找到更大数的数,还有后续循环会变会遍历到的可能情况。为考虑循环的影响,这里就有两个思路:一个是构造出一个数组二倍的数组,进行遍历。本题代码构建的重点就是维持好映射关系。原创 2023-02-28 10:51:24 · 67 阅读 · 0 评论 -
185、【栈与队列】leetcode ——496. 下一个更大元素 I:单调栈-哈希表(C++版本)
中想等元素时,就记录答案。如果没有遇到就进行正常的入栈,出栈操作。因此,第一步需要找到想等数,第二步需要找到大于的数。中下标,采用空间换时间的方式,避免两重for循环。方式,维持一个从栈底到栈顶的递减栈。对于第一步,我们可以用Hash表完成。对于第二步,就采用和每日温度相同的。的区别在于,需要先通过让。判定出为想等元素后,再去找。中想等元素的映射关系,存储。原创 2023-02-27 22:46:56 · 174 阅读 · 0 评论 -
184、【栈与队列】leetcode ——739. 每日温度(C++版本)
更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。每次遍历到一个数时,就再开辟一个变量找此数后面第一个大于它的数,找到则添加,没找到则返回0。单调栈的本质是空间换时间,原创 2023-02-27 17:05:02 · 99 阅读 · 0 评论 -
【算法刷题】栈与队列题型及方法归纳
栈是仅能对其一端进行操作的结构,实现后进先出的效果。在C++中采用容器适配器的方式实现栈。(容器适配器实际上就是对某一类型的对象进行泛化,定义了这一类泛化对象的可进行操作的逻辑)stack的容器有三种有和,默认使用的是容器。原创 2023-01-09 23:25:11 · 348 阅读 · 0 评论 -
87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)
中各元素出现次数,维护一个优先级队列,在里面存k个数,采用小根堆方式,从小到大进行排列。当存入的数多余k个时,将队头(最小值)弹出。(堆中至多k个,每次调整堆需要。原创 2023-01-09 22:54:21 · 219 阅读 · 0 评论 -
86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)
本题的特点是维护一个窗口,在窗口不断向前移动时,获取其中的最大值。由于窗口在向前移动过程中,元素存在着进入和出去的连续顺序,与FIFO的特点类似。在移动窗口的过程中,当队头元素与移除元素相同时,则弹出。然后将进入窗口的元素加入到队内,每次都将队头中的最大值加入到结果集中。加入元素,当已存入的队尾元素比待加入元素小时,弹出旧元素,直至队尾当前指向元素大于或等于待加入元素时,将其加入队尾,从而实现。中的最大值元素而已,并不需要对所有添加过的元素都进行维护,因此我们可使用。可保证维护对顺序的时间复杂度为。原创 2023-01-09 19:26:00 · 489 阅读 · 0 评论 -
85、【栈与队列】leetcode ——150. 逆波兰表达式求值(C++版本)
求逆波兰表达式(后缀表达式)的过程实际上就是将对应的中缀表达式用树结构存储后,再对树进行后序遍历的过程。每次遇到一个运算符时,弹出两个元素进行运算,直至将原字符串全部遍历完。原创 2023-01-07 20:06:28 · 91 阅读 · 0 评论 -
84、【栈与队列】leetcode ——1047. 删除字符串中的所有相邻重复项:栈+双指针解法(C++版本)
然后遍历下一个元素,直至全部遍历完,让各个相邻元素都不重复的存入栈中。再将其弹栈存入到子串中,因为栈为后进先出,因此需要让字符串进行逆置,恢复原始顺序。其实,就相当于是i为pre指针,i+1为cur指针,j为temp指针(用于存入新元素,指向新子串末尾的下一个位置)。此题和溢出链表元素题的区别,在于本题需要对比的不仅仅是对比原始链表中的相邻元素,还需要再与已经存入的元素进行对比。当原始字符串中相邻元素不相同,而且待存入元素与新字符串的末尾元素不相同时,存入该元素。,让下一次覆盖已存入的元素,并剪枝。原创 2023-01-07 19:27:33 · 435 阅读 · 0 评论 -
83、【栈与队列】leetcode ——20. 有效的括号(C++版本)
使用一个栈存储括号,遇到左括号压入,遇到右括号时,查看栈顶元素是否与之匹配,如果匹配则弹出,如果不匹配,则返回。将左括号,用对应的右括号记录,当要弹出右括号时,判定是否与栈中括号相同,若相同,则弹出,若不同则不弹出。要注意,如果遇到右括号时,想要top前要保证栈不为空。最后看栈中元素是否为空,如果为空说明全部匹配,返回。原创 2023-01-07 18:14:27 · 63 阅读 · 0 评论 -
82、【栈与队列】leetcode ——225. 用队列实现栈(C++/Python版本)
当需要实现对栈顶元素操作功能时,先将queue1中前n-1个元素存入queue2中,此时queue1中剩余的唯一元素便相当于是栈的栈顶元素,弹出即可。此时相当于队列循环往复,想输出栈顶元素(也就是队尾元素)时,先将前n-1个元素移动到队尾,直到遍历到最后一个元素时,弹出。然后,将queue2中元素再重新按原先排列顺序存入queue1中。时间复杂度:弹出栈顶元素pop、获取栈顶元素top的实现复杂度为。其中一个队列用于存当前操作的元素,另一个队列当媒介。原创 2023-01-06 22:19:54 · 99 阅读 · 0 评论 -
81、【栈与队列】leetcode ——232. 用栈实现队列(C++/Python版本)
此时输出stack-out中元素时,先被输出的便是stack-in中的栈底元素。从而实现了队里的FIFO操作方式。每次先输入的会被压入到stack-in的栈底,当想要实现队列的方式输出时,一个stack用于输入元素,另一个stack用于输出元素。因此就再用另一个stack-out作为媒介,的方式,因此就使用两个栈来实现。原创 2023-01-06 21:47:30 · 107 阅读 · 0 评论