[數(shù)組]接雨水

42. 接雨水

題目描述

給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖,計(jì)算按此排列的柱子,下雨之后能接多少雨水。

image

上面是由數(shù)組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個(gè)單位的雨水(藍(lán)色部分表示雨水)。 感謝 Marcos 貢獻(xiàn)此圖。

示例:

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

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/trapping-rain-water

解題思路

  • 方法1:
    • 計(jì)算每一列的雨水,最后累積和,其中雨水能達(dá)到的最高位置等于兩邊距離最近的高點(diǎn)的較小值減去當(dāng)前高度
  • 方法2: 雙指針
    • 只要right_max[i] > left_max[i] ,積水高度將由 left_max 決定, 反之也成立
      所以我們可以認(rèn)為如果一端有更高的條形塊(例如右端),積水的高度依賴于當(dāng)前方向的高度(從左到右)。當(dāng)我們發(fā)現(xiàn)另一側(cè)(右側(cè))的條形塊高度不是最高的,我們則開(kāi)始從相反的方向遍歷(從右到左)。
      我們必須在遍歷時(shí)維護(hù) left_max 和 right_max ,但是我們現(xiàn)在可以使用兩個(gè)指針交替進(jìn)行,實(shí)現(xiàn) 1 次遍歷即可完成。

代碼實(shí)現(xiàn)

  • 方法1:
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height:
            return 0
        n = len(height)
        max_left = [0] * n
        max_right = [0] * n
        max_left[0] = height[0]
        max_right[-1] = height[-1]
        # 找位置i左邊最大值
        for i in range(1, n):
            max_left[i] = max(height[i], max_left[i-1])

        for i in range(n-2, -1, -1):
            max_right[i] = max(height[i], max_right[i+1])

        res = 0
        for i in range(n):
            res += min(max_left[i], max_right[i]) - height[i]
        return res
  • 方法2:
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height: return 0
        left = 0
        right = len(height) - 1
        res = 0
        # 記錄左右兩邊最大值
        left_max = height[left]
        right_max = height[right]
        while left < right:
            if height[left] < height[right]:
                if left_max > height[left]:
                    res += left_max - height[left]
                else:
                    left_max = height[left]  # 更新 left_max
                left += 1
            else:
                if right_max > height[right]:
                    res += right_max - height[right]
                else:
                    right_max = height[right]  # 更新right_max
                right -= 1
        return res
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 題目描述(困難難度) 黑色的看成墻,藍(lán)色的看成水,寬度一樣,給定一個(gè)數(shù)組,每個(gè)數(shù)代表從左到右墻的高度,求出能裝多少...
    windliang閱讀 650評(píng)論 0 0
  • LeetCode 42 Trapping Rain Water Description Given n non-n...
    ruicore閱讀 280評(píng)論 0 1
  • Binary Tree 的遍歷,Time: O(n), Space: O(n).先序遍歷:preorder(nod...
    浩澤Hauser閱讀 589評(píng)論 0 1
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。個(gè)人博客地址:https://yangyuanlin.club歡迎來(lái)...
    靜水流深ylyang閱讀 288評(píng)論 0 1
  • 樹(shù)形結(jié)構(gòu) 在前面章節(jié)中介紹到的數(shù)據(jù)結(jié)構(gòu),都為線性結(jié)構(gòu),比如鏈表,數(shù)組,隊(duì)列等,都屬于線性結(jié)構(gòu),類似于通過(guò)一根線串在...
    ducktobey閱讀 1,408評(píng)論 0 0

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