力扣热题100之接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
力扣热题100之接雨水_第1张图片

代码

方法一:动态规划

需要明白的是,位置i能接住的雨水数,其实是位置i的左右最大高度的最小值减去位置i处的高度。
所以重点是找出每个位置的左右最大高度。
位置i的左边最大高度为:leftmax[i]=max(leftmax[i-1],height[i])
右边最大高度为:rightmax[i]=max(rightmax[i+1],height[i])
为了得到leftmax[i]就必须从左往右进行遍历,保存每个位置处的最大值。
为得到rightmax[i]就必须从右往左遍历,保存每个位置处的最大值。

class Solution:
    def trap(self, height: List[int]) -> int:
        n=len(height)
        if not height:
            return 0
        leftmax=[height[0]]+[0]*(n-1)
        for i in range(1,n):
            leftmax[i]=max(leftmax[i-1],height[i])
        rightmax=[0]*(n-1)+[height[n-1]]
        for i in range(n-2,-1,-1):
            rightmax[i]=max(rightmax[i+1],height[i])
        res=0
        for i in range(n):
            res+=min(leftmax[i],rightmax[i])-height[i]
        return res

方法二:双指针

这个方法其最主要的思想就是将左右两个指针都移动到这个这表中最大的数Max的位置i_Max,在i_Max左侧部分的数据列表的积水量是由这个数的左边的最大值leftmax减这个数height[left]决定的,在i_Max右侧部分的数据列表的积水量是由这个数右侧的最大值rightmax减这个数height[right]决定的。

class Solution:
    def trap(self, height: List[int]) -> int:
        n=len(height)
        leftmax,rightmax=0,0
        left,right = 0,n-1
        res=0
        while left < right :
            leftmax=max(leftmax,height[left])
            rightmax=max(rightmax,height[right])
            if height[left]

方法三:单调栈

这个方法和上面的两种方法的不同之处在于,单调栈是从下往上一层一层的接雨水,具体可由下面两张图体现出来:
力扣热题100之接雨水_第2张图片
力扣热题100之接雨水_第3张图片
这个方法中栈中存在两及以上个元素,num>height[stack[-1]]这个条件满足时就代表存在凹槽,这个时候就就先把最内层的凹槽接满水。这个过程中还应该将装满水的凹槽pop出去,使得下次能够准确检测到较外层的凹槽,将其装满水。循环下去,直到栈中的元素为空,或者不满足num>height[stack[-1]]这个条件时,跳出循环,i接着向右移动。

class Solution:
    def trap(self, height: List[int]) -> int:
        stack=[]
        res=0
        n=len(height)
        for i, num in enumerate(height):
            while stack and num>height[stack[-1]]:
                top=stack.pop()
                if not stack:
                    break
                left=stack[-1]
                w=i-left-1
                h=min(height[left],num)-height[top]
                res+=w*h
            stack.append(i)
        return res

你可能感兴趣的:(力扣热题100,leetcode,算法,数据结构,动态规划,python)