LeetCode Hot100 接雨水
题目地址: https://leetcode.cn/problems/trapping-rain-water/description/
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
// 思路:记录i位置左边最大值和右边最大值
// 当前位置的水量 = max(min(左边最大值,右边最大值) - 当前高度 , 0)
// 如果 min(左边最大值,右边最大值) - 当前高度 < 0。说明当前位置的高度最高没法接住水func trap(height []int) int {ans := 0n := len(height)lmax := make([]int, n)rmax := make([]int, n)lmax[0] = height[0]rmax[n-1] = height[n-1]for i := 1; i < n; i++ {lmax[i] = max(lmax[i-1], height[i])}for i := n - 2; i >= 0; i-- {rmax[i] = max(rmax[i+1], height[i])}for i := 0; i < n; i++ {ans += max(min(rmax[i], lmax[i])-height[i], 0)}return ans
}
使用两个变量优化
func trap(height []int) int {ans := 0n := len(height)lmax := height[0]rmax := height[n-1]l := 1r := n - 2for l <= r {if lmax <= rmax {ans += max(lmax-height[l], 0)lmax = max(lmax, height[l])l++} else {ans += max(rmax-height[r], 0)rmax = max(rmax, height[r])r--}}return ans
}