美文网首页Leetcode
Leetcode 42. Trapping Rain Water

Leetcode 42. Trapping Rain Water

作者: SnailTyan | 来源:发表于2021-02-08 09:27 被阅读0次

    文章作者:Tyan
    博客:noahsnail.com  |  CSDN  |  简书

    1. Description

    Trapping Rain Water

    2. Solution

    解析:总的留存的雨水等于每个柱子上留存的雨水,而每个柱子上留存的雨水等于其左边最高柱子与右边最高柱子中较矮柱子的高度减去其高度。Version 1超时,Version 2是以空间换时间,Version 3是对Version 2的进一步优化。

    • Version 1
    class Solution:
        def trap(self, height):
            length = len(height)
            evalation_map = [0] * length
            for i in range(length):
                self.trap_rain(evalation_map, i, height)
    
            return sum(evalation_map)
    
    
        def trap_rain(self, evalation_map, index, height):
            left = index
            right = index
    
            i = index
            while i >= 0:
                if height[i] > height[left]:
                    left = i
                i -= 1
    
            if left == index:
                return
            i = index
            while i <= len(height) - 1:
                if height[i] > height[right]:
                    right = i
                i += 1
    
            evalation_map[index] = min(height[left], height[right]) - height[index]
    
    • Version 2
    class Solution:
        def trap(self, height):
            length = len(height)
            evalation_map = [0] * length
    
            left = [i for i in range(length)]
            right = [i for i in range(length)]
    
            max_index = 0
            for i in range(length):
                if height[i] >= height[max_index]:
                    max_index = i
                else:
                    left[i] = max_index
    
            max_index = length - 1
            for i in range(length - 1, -1, -1):
                if height[i] >= height[max_index]:
                    max_index = i
                else:
                    right[i] = max_index
    
            for i in range(length):
                evalation_map[i] = min(height[left[i]], height[right[i]]) - height[i]
    
            return sum(evalation_map)
    
    • Version 3
    class Solution:
        def trap(self, height):
            left = 0
            right = len(height) - 1
            result = 0
            max_left_index = 0
            max_right_index = len(height) - 1
            while left < right:
                if height[left] < height[right]:
                    if height[left] >= height[max_left_index]:
                        max_left_index = left
                    else:
                        result = result + height[max_left_index] - height[left]
                    left += 1
                else:
                    if height[right] >= height[max_right_index]:
                        max_right_index = right
                    else:
                        result = result + height[max_right_index] - height[right]
                    right -= 1
            return result
    

    Reference

    1. https://leetcode.com/problems/trapping-rain-water/

    相关文章

      网友评论

        本文标题:Leetcode 42. Trapping Rain Water

        本文链接:https://www.haomeiwen.com/subject/jbcztltx.html