Lintcode_接雨水

原題目地址

描述

給出 n 個非負整數,代表一張X軸上每個區域寬度爲 1 的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水。

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.

rain_water_trap

樣例

  • 樣例 1:
    輸入: [0,1,0]
    輸出: 0

  • 樣例 2:

    輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
    輸出: 6

挑戰

  • O(n) 時間, O(1) 空間
  • O(n) 時間, O(n) 空間也可以接受

思路

  • 計算柱子I能承接多少水,其實就是尋找左邊最大的極值LeftMax[I],右邊最大的極值RightMax[I];
  • 在水不漏掉的情況下,即左右兩邊的最大極值大於height[I]
  • 得到每根柱子能承接的水量 min(LeftMax[I], RightMax[I]) - height[I]

代碼

在實際操作中,將一次尋找左邊最大值的遍歷 和 最後的計算合併

class Solution:
    """
    @param heights: a list of integers
    @return: a integer
    """

    def trapRainWater(self, heights):
        length = len(heights)

        if length < 2:
            return 0

        leftMax = []
        rightMax = []

        # for i in range(length):
        #     if i == 0:
        #         leftMax.append(0)
        #     elif i == 1:
        #         leftMax.append(heights[0])
        #     else:
        #         leftMax.append(max(leftMax[i - 1], heights[i - 1]))

        for i in range(length - 1, -1, -1):
            if i == length - 1:
                rightMax.append(0)
            elif i == length - 2:
                rightMax.append(heights[length - 1])
            else:
                rightMax.append(max(heights[i + 1], rightMax[length - i - 2]))


        # rightMax.reverse()
        # print(rightMax)

        rain = 0
        for i in range(length):
            if i == 0:
                leftMax.append(0)
                rain += 0
                continue
            elif i == 1:
                leftMax.append(heights[0])
            else:
                leftMax.append(max(leftMax[i - 1], heights[i - 1]))

            if leftMax[i] > heights[i] and rightMax[length-i-1] > heights[i]:
                rain += min(leftMax[i], rightMax[length-i-1]) - heights[i]

        # print(leftMax)
        return rain


if __name__ == '__main__':
    print(Solution().trapRainWater([1, 3, 4, 5, 2, 4, 7, 4, 3]))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章