栈和队列
文章平均质量分 80
栈,队列类型 算法题
小酒窝.
研一菜鸡一只,欢迎来交流讨论,一起进步!
展开
-
单调栈 & 单调队列 专题
上述操作通过维护单调递增栈,求出了数列中每个数左边第一个比它小的数。同理可以维护单调递减栈,求出数列中每个数左边第一个比它大的数。将枚举顺序转换,从后往前枚举,便能求出数列中每个数右边第一个比它小/大的数。求区间最小值,维护单调递增栈;求区间最大值,维护单调递减栈。把原理搞懂,能够用代码实现之后,这两种算法就掌握了。在以后的题目中,如果需要求每个位置左边/右边第一个比其大/小的元素,就要想到用单调栈;如果需要维护一个移动区间的最值,用单调队列O(n)O(n)O(n)原创 2023-01-05 12:23:36 · 1402 阅读 · 1 评论 -
Perfect Flush(栈,贪心)
在这种判断方式下,所有拿过的数只会被判断一次,O(n),并且保证了所拿子序列字典序最小。但是如果对于每个位置都遍历之前拿过的数,复杂度是 O(n^2),需要优化。找到字典序最小的子序列,使得 1 ~ m 中的所有数出现且仅出现一次。保证对于 1 ~ m 中的所有数都会出现在这个数组中至少一次。可以用一个栈来实现上述判断,栈中依次存放要拿的子序列中的数。代码很简单,但是想清楚思路还是要花点时间的。从前往后对于每个位置来说,假设当前位置。判断了之前拿过的数,到当前位置。最终栈中元素就是所选子序列元素。原创 2023-01-03 17:48:46 · 570 阅读 · 0 评论 -
C. Paint(单调栈,上海12月月赛)
Linking题意:给定长度为 n 的栅栏,需要将这些栅栏染色,初始每个栅栏的颜色都为0。两种操作:1 x y:将最后的 x 个栅栏染成颜色y;2:输出这 n 个栅栏的颜色种类数。思路:像不像线段树?一开始就奔着这个去的,到最后都没写出来。。线段树的染色问题是:可以染色和询问任意区间的栅栏,而染色颜色的种类不超过30(或60)种。这样便可以用二进制来表示出每个区间的颜色种类数,两个区间颜色种类数合并的话只需要将两个二进制数取或。很妙的思路!但这题的特殊性在于:每次染色都将后面的所有位置原创 2021-12-27 09:44:15 · 320 阅读 · 0 评论 -
King of Range(区间个数,双指针,单调队列/ST表)
只要需要求区间最值的区间是一个位置一个位置移动的,那么就可以用单调队列来维护最值,处理这种移动的区间最值问题。右移的时候,区间中就少了几个数,可能这个区间就不合法了。需要注意的是,这个题目中需要调用 query 的地方很多,而每次调用该函数都会调用一次。,把该位置作为区间左端点,向右二分找第一个满足的右端点。,把当前位置作为区间左端点,往后找第一个合法的右端点。,该位置和后面的所有位置都可以作为右端点,能够贡献。,该位置和后面的所有位置都是满足的,区间个数贡献。,问一共有多少个不同的区间满足,其元素。原创 2021-07-31 22:29:08 · 119 阅读 · 0 评论