【Leetcode】42. Trapping Rain Water解题报告

在这里插入图片描述
求能接到雨水的体积

方法1

使用递增栈和相减法来解决问题。
可以接的雨水的体积就是红色方框的减去1-5部分的体积。我们先从左往右和从右往左找到第一个最高的柱子,分别用一个递增栈来保存,然后就可以轻松的画出1-5这五个需要减掉的部分。时间复杂度为O(n)
在这里插入图片描述

class Solution:
    def trap(self, height):
        if height == [] or height == None:
            return 0
        maxheight = max(height)
        left ,right = 0, 0
        for i in range(len(height)):
            if height[i] == maxheight:
                left  = i
                break
        for i in range(len(height)-1, -1, -1):
            if height[i] == maxheight:
                right = i
                break
        stack_left2right = []
        for i in range(left+1):
            if len(stack_left2right) == 0:
                stack_left2right.append(i)
            else:
                if height[i] > height[stack_left2right[-1]]:
                    stack_left2right.append(i)

        stack_right2left = []
        for i in range(len(height)-1, right-1, -1):
            if len(stack_right2left) == 0:
                stack_right2left.append(i)
            else:
                if height[i] > height[stack_right2left[-1]]:
                    stack_right2left.append(i)

        minus = 0
        for i in range(1,len(stack_left2right)):
            minus += (height[stack_left2right[i]] - height[stack_left2right[i-1]]) * (stack_left2right[i] - 0)

        stack_right2left = stack_right2left[::-1]
        for i in range(len(stack_right2left)-2,-1,-1):
            minus += (height[stack_right2left[i+1]] - height[stack_right2left[i]] )* (stack_right2left[i] - len(height)+1)

        res = 0
        for i in height:
            res += maxheight - i
        res -= minus
        return res

方法2

逐层统计法
我们按照自底向上每一层进行统计,没统计完一层就将每根柱子的高度减1,直到所有柱子的高度都小于等于0结束。
第一层:
在这里插入图片描述
第二层:
在这里插入图片描述
第三层:
在这里插入图片描述
时间复杂度为O(n*maxheight)
超时代码(314/315)

class Solution:
    def trap(self, height):
        """ :type height: List[int] :rtype: int """
        if height == [] :
            return 0
        length = len(height)
        maxheight = max(height)
        result= 0
        for i in range(0,maxheight):
            left = 0
            right=length-1
            while(height[left]<=0 and left<length):
                left+=1
            while(height[right]<=0 and right>-1):
                right-=1
            for j in range(left,right+1):
                if height[j]<=0:result+=1
                else:height[j]-=1

        return result