LeetCode 42 [Trapping Rain Water]

原題

給出 n 個(gè)非負(fù)整數(shù),代表一張X軸上每個(gè)區(qū)域?qū)挾葹?1 的海拔圖, 計(jì)算這個(gè)海拔圖最多能接住多少(面積)雨水。

海拔分別為 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

解題思路

  • 一塊直柱能接的水取決于左右兩邊較短的高度,所以第一個(gè)比較直觀的方法是從左到有遍歷一遍記錄該點(diǎn)左邊的最大值,從右到左遍歷一遍記錄該點(diǎn)的右邊的最大值,此方法為O(n) 時(shí)間, O(n) 空間,第二種方法可以利用單調(diào)遞減棧來實(shí)現(xiàn),此方法為O(n) 時(shí)間, O(n) 空間
  • 第三種方法為先找出中間最大點(diǎn),然后左邊部分相當(dāng)于已經(jīng)確定了右邊最大值,左指針不斷向右逼近就行,右邊部分相當(dāng)于記錄了左邊最大值,右指針不斷向左逼近就行,此方法為O(n) 時(shí)間, O(1) 空間,第四種方法類似第三種,左右夾逼,每次選擇小的那個(gè)指針向中間靠攏,此方法為O(n) 時(shí)間, O(1) 空間,但是要比方法三少遍歷一遍。

完整代碼

# 方法三
class Solution:
    # @param heights: a list of integers
    # @return: a integer
    def trapRainWater(self, heights):
        water = 0
        MaxIndex = -1
        MaxHeight = -1
        for i in range(1, len(heights)):
            if heights[i] > MaxHeight:
                MaxHeight = heights[i]
                MaxIndex = i
                
        prev = 0
        for i in range(0, MaxIndex):
            if heights[i] > prev:
                water += (heights[i] - prev) * (MaxIndex - i)
                prev = heights[i]
            water -= heights[i]
            
        prev = 0
        for i in range(len(heights) - 1, MaxIndex, -1):
            if heights[i] > prev:
                water += (heights[i] - prev) * (i - MaxIndex)
                prev = heights[i]
            water -= heights[i]
            
        return water

# 方法四
class Solution:
    # @param heights: a list of integers
    # @return: a integer
    def trapRainWater(self, heights):
        n = len(heights)
        l, r, water, minHeight = 0, n - 1, 0, 0
        while l < r:
            while l < r and heights[l] <= minHeight:
                water += minHeight - heights[l]
                l += 1
            while l < r and heights[r] <= minHeight:
                water += minHeight - heights[r]
                r -= 1
            minHeight = min(heights[l], heights[r])
        return water
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容