首页 > 其他分享 >单调栈

单调栈

时间:2023-02-18 22:45:05浏览次数:40  
标签:出栈 nums int 元素 st 单调

栈是一种后进先出的线性的数据结构,但若在栈的结构之上再规定栈中元素大小需满足单调关系,即成为单调栈。

单调栈分为单调递增栈和单调递减栈:

1. 单调递增栈即栈内元素保持单调递增的栈
2. 单调递减栈即栈内元素保持单调递减的栈

操作规则(以单调递增栈为例):

1. 如果新的元素比栈顶元素大,就入栈
2. 如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小

单调栈具有如下性质:

1.栈内元素是递增的
2.当栈中已有元素需要出栈时(遇见了比它小的新元素),说明后续这个新元素是需要出栈的元素向后找第一个比其小的元素
3.当元素出栈后,新栈顶元素是出栈元素向前找第一个比其小的元素

举个例子,现在栈中元素是 2 3 7 。
接下来新元素是4 ,那么在7需要出栈。
当7出栈时,新元素4即为7右边第一个比7小的元素。
当7出栈时,3成为新的栈顶,那么3就是7左边第一个比小的元素。
单调栈可以用\(O(n)\)的复杂度找到序列中第一个大于给定元素的位置和第一个小于(严格来说是小于等于)给定元素的位置。

例题

柱状图中的最大矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
image

思路

对于每一个矩形,我们需要找到两个边界:第一个高度小于它的右边界和第一个高度小于它的左边界,利用单调栈可以很好的解决这个问题。

class Solution {
public:
    int largestRectangleArea(vector<int>& nums)
    {
        int ans = 0;
        //栈中存放的是索引,一定不要搞混淆了
        stack<int> st;
        //一开始添0,保证在计算过程中,即while循环体内部栈不会变空
        nums.insert(nums.begin(),0);
        //最后添0,即使给定一个递增序列也可顺利求出
        nums.push_back(0);
        for(unsigned i = 0; i < nums.size(); i++)
        {
            while(!st.empty() && nums[i] < nums[st.top()])
            {
                int temp = st.top();
                st.pop();
                int width = i - st.top() - 1;
                int height = nums[temp];
                ans = max(ans, width * height);
            }
            st.push(i);
        }
        return ans;
    }
};

标签:出栈,nums,int,元素,st,单调
From: https://www.cnblogs.com/parallel-138/p/17133861.html

相关文章

  • 单调队列
    单调队列是什么呢?可以直接从问题开始来展开。Poj2823给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数。数列长度:N<=106,m<=N暴力解很直观的一种解法,那就......
  • 代码随想录——单调栈
    每日温度题目中等什么时候用单调栈呢?通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。classSoluti......
  • LeetCode接雨水(/dp 单调栈 双指针)
    原题解题目给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。约束题解解法一classSolution{public:inttra......
  • 决策单调性与四边形不等式
    参考自:《决策单调性与四边形不等式》,彭思进,感谢Itst的耐心答疑/bx《决策单调性与四边形不等式-学习笔记》,p_b_p_b的博客一、决策单调性与四边形不等式定义1.......
  • 单调
    超级神仙题。题意给你一个序列\(a_1\dotsa_n\),值域为\([1,3]\)最大化选择的不交的合法子序列数,一个合法的子序列是\(1,2,3\)或\(3,2,1\),\(n\leq10^5\),输出方案......
  • 【CSP201312-3】最大的矩形,单调栈
    problem201312-3试题名称:最大的矩形时间限制:1.0s内存限制:256.0MB问题描述:问题描述在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1≤i≤n)个矩形的高度......
  • 1.4 单调栈
    84.柱状图中最大的矩形最大矩形的高度瓶颈可能在于各个柱子的高度,如图所示基于以上观察,一个朴素算法是:枚举每种可能的高度瓶颈1.1向左、右扩展宽度1.2擂台更新......
  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • 重学单调队列优化dp
    再谈单调队列优化dp。题目:CF1077F1&2PictureswithKittens(Easy&hardversion)从n个数中选出m个数,连续k个数至少选出一个,最大化选出数和。easyversion普通dp,hard则......
  • 2019南昌网络赛 I. Max answer(DP或者单调栈+思维)
    Alicehasamagicarray.Shesuggeststhatthevalueofaintervalisequaltothesumofthevaluesintheinterval,multipliedbythesmallestvalueinthein......