攒青豆-单调栈

53 阅读1分钟

当青训营遇上码上掘金

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

以下为上图例子的解析:

输入:height = [5,0,2,1,4,0,1,0,3]  
输出:17  
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

思路

对于本题,我们可以维护一个单调栈

当栈顶的元素下标小于栈顶元素的上一个元素的,那么就会形成一个凹槽,高度为两个元素最小值减去栈顶元素,长度为元素下标减去栈顶元素上一个元素的下标再减去一。 总的累积的绿豆就是所有这些凹槽累积之和

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int N=1e5+10;
stack<int> s;
int res;
int main(){
    int n, x;
    cin>>n;
    vector<int> v;
    for(int i=0;i<n;i++){
        cin>>x;
        v.push_back(x);
    }
    for(int i=0;i<n;i++){
        while(!s.empty() && v[s.top()] < v[i]) {
            int hh = v[s.top()];
            s.pop();
            if(s.empty()) break;
            int h = min(v[s.top()],v[i])-hh;
            int w = i-s.top() -1;
            res += w*h;
        }
        s.push(i);
    }
    cout<<res<<endl;

}