Swift刷算法:接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
LeetCode: https://leetcode.cn/problems/trapping-rain-water/submissions/

image.png
class Solution {
    func trap(_ height: [Int]) -> Int {
        guard height.count > 2 else { return 0 }
        
        // 左右做高点
        var maxL = height.first!
        var maxR = height.last!
        
        // 左右指针
        // 双指针从左右分别向中间移动,遇到高点更新高点,遇到低点更新水量
        var L = 0
        var R = height.count - 1
        
        // 结果
        var res = 0

        while L < R {
            if maxL <= maxR {
                // 左边高点比右边矮,则左边指针右移
                L += 1
                
                if height[L] >= maxL {
                    // 遇到左侧新高
                    maxL = height[L]
                } else {
                    // 遇到左侧低点,则形成洼地,储水增加
                    res += maxL - height[L]
                }
            } else {
                // 右边高点比左边矮,则右边指针左移
                R -= 1
                if height[R] >= maxR {
                    // 遇到右侧新高
                    maxR = height[R]
                } else {
                    // 遇到右侧低点,则形成洼地,储水增加
                    res += maxR - height[R]
                }
            } 
        }

        return res
    }
}
image.png

你可能感兴趣的:(Swift刷算法:接雨水)