42. Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

avatag

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

Solution1:(TLE)

class Solution:
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        res = 0
        for i in range(1,len(height)-1):
            maxleft,maxright = 0,0
            for j in range(i,-1,-1):
                maxleft = max(maxleft,height[j])
            for j in range(i,len(height)):
                maxright = max(maxright,height[j])
            res += min(maxright,maxleft) - height[i]
            # print('i',i,'maxleft',maxleft,'maxright',maxright,'ans',min(maxright,maxleft) - height[j])
        return res

每个位置的组左右高度,不是其相邻位置的高度,而是整个左边部分和右边部分的最大值

Solution2:

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

先用动态规划求出每个点的情况,然后再算。

posted @ 2018-11-02 10:03  bernieloveslife  阅读(127)  评论(0)    收藏  举报