单调栈C语言

单调栈

什么是单调栈

单调栈和栈一样是一种线性表只不过唯一区别是他栈内的元素是单调递增或单调减的。这种线性表结构我们可以用于求区间内的最值和范围。
下面我们引入例题来显单调栈的魅力

实践出真知

题目链接:直方图中最大的矩形
我的想法
首先,看到这道题目我看了那幅图
单调栈C语言_第1张图片
想到怎么求他的矩形面积?经过思考我想到求出他的左右边界再乘以他当前矩形条的面积不就行了,而他的左右边界的限制条件又是显而易见的,就是和他们当前矩形的高度大小有关,大的就可以,而小的就不行。所以我们只要将每个矩形的左右边界存到left和right两个数组中就行了。而这又和单调栈的求区间的范围不谋而合。注意我们要在目标数组的头和尾部插入数据-1来表示最终终止条件。
下面就是如何得到左边界的代码实现:

int t[100010],letf[100010];
void Get(int bound[])
  {
    int site;
    for (int i = 1; i <= n; i++) 
    {
        site=i;
        while(t[site]>=t[i])site--;
        bound[i] = site;
    }
}

这样我们就可以将所有位置矩形的左边界存到left数组中了,只要将数组倒序比较同时site++,又能得到right数组的值了。
最终,我们只需要将每个位置的left和right组成面积求每个矩形的最大面积就行了。
下面就是求最大面积的部分代码实现:

int Result=0;
    for(i=1;i<n;i++)
    {
        if(Result<t[i]*(right[i]-left[i]+1))
            Result=t[i]*(right[i]-left[i]+1);
    }

以上就是我对单调栈的理解,如有错误希望各位大神指正。

你可能感兴趣的:(笔记)