单调栈算法

维护一个单调栈,正序排列,进行遍历,不满足条件放入栈,满足条件则对栈内元素所在位置处理,遍历一次后所有元素解决
单调栈分为单调递增栈或单调递减栈,适用于需要比较大小关系且与元素位置有关的问题

单调栈方法:
1.构建栈储藏满足(递增||递减)关系的元素位置,一般按照题意反向取增减关系
2.遍历,当第i个元素符合题意时,将之依次与栈中元素比较,pop元素,并求出元素对应所需值
3.依照题意取值

leetcode 42 接雨水说明单调栈
单调栈算法_第1张图片
分析:
1.接雨水需要比较容器左右边高
2.可以看成是多个容器拼接,容器位置关系与题目相关
因此可以使用单调栈=>拆分为多个长方形,长方形宽即位置差,高即与次高位置的高度差
单调栈算法_第2张图片

class Solution:
    def trap(self, height: List[int]) -> int:
        if height==[]:
            return 0
        total = 0
        #单调递减栈
        stack = [0]
        #用0初始化一个lastpop,以确保当存在第一个高于栈内元素时高度不受lastpop影响
        height.append(0)
        #遍历
        for i in range(1,len(height)-1):
        #初始化lastpop,使height[lastpop]=0
        #当然,由于该题特殊性,每次第i个位置高度高于stack[-1]时,其与stack[-1]相邻,不可能积水,积水宽度为0,因此可以直接让lastpop初始化为stack[-1]
            lastpop=len(height)-1
            if stack:
                while stack and height[i]>=height[stack[-1]]:
                    width = i - stack[-1]-1
                    total += (height[stack[-1]]-height[lastpop])*width
                    lastpop = stack.pop()
                    print(i,stack,total)
                    if stack != [] and height[i]<height[stack[-1]]:
                        total += (height[i]-height[lastpop])*(i-stack[-1]-1)
                        print(i,total)
                    #print(i,stack,total)              
                stack.append(i)
        return total

你可能感兴趣的:(算法,python,栈,算法)