一文弄懂单调栈(附示例和代码)

2024-05-14 1113阅读

栈,先进后出的数据结构。

单调栈,顾名思义,是在栈的基础上增加了单调性。这就要求每传入一个数据,就需要和最新入栈的数据进行比较,符合单调性就入栈,否则就持续出栈,直到符合单调性,然后把该数据入栈。

举个例子,给出一个数组,[10,15,20,8,6,13,12,5],依次入栈,要求单调递增

一文弄懂单调栈(附示例和代码)

算法题应用(Leetcode接雨水问题),建议先自己写一遍,看看能否自己解决。

一文弄懂单调栈(附示例和代码)

这道题就可以使用单调栈作为一种解题思路,举一个简单的示例数组[4,1,1,3],看看我们解题需要什么数据。

一文弄懂单调栈(附示例和代码)

要计算“雨水量”,我们需要知道两侧的墙壁高度,记作h1、h2,还需要知道宽度w,另外还有底b,这样我们就可以计算雨水容量capacity=[min(h1,h2)-b]×w,在这个示例中,也就是(3-1)×2=4

总结,要计算这个容积,需要知道两侧高度、底和宽度,而宽度可以使用数组的索引计算。

这道题按照单调栈(单调递减的栈)解题思路如下:

一文弄懂单调栈(附示例和代码)

每当有数据出栈,就需要计算一次雨水量,两侧高度可以通过栈中相邻的两个数据获取到,底就是出栈的数据,宽度是索引之差。

现在来写程序。

class Solution {
    public int trap(int[] height) {
        int result = 0;
        //单调栈,在接雨水问题中,是单调递减的栈,存储数组的索引,不存储具体的数值
        List list = new ArrayList();
        //遍历数组
        for (int arrayIndex = 0; arrayIndex  0 && height[arrayIndex] >= height[list.get(list.size()-1)]){
                    if(list.size()>=2){
                        //两个边较低的值减去底,然后*宽度
                        result+=((Math.min(height[list.get(list.size()-2)], height[arrayIndex]) - height[list.get(list.size()-1)]) * (arrayIndex - list.get(list.size()-2) - 1));
                    }
                    list.remove(list.size()-1);
                }
                list.add(arrayIndex);
            }
        }
        return result;
    }
}

PS:这里的程序与我上面的描述有点出入,这里每次出栈都要计算一次雨水量,针对[4,1,1,3]这个数组,第一个1出栈的时候计算一次,雨水量是0;第二个1出栈的时候再计算一次,雨水量是4。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]