【leetcode】接雨水

215 阅读1分钟

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6

题目分析

只有低洼处才能接雨水,且接的雨水多少取决于低洼处边沿最低的地方。因此需要至少3个整数,且左右两边的整数大于中间的整数,接的雨水数等于左右整数间最小值和中间值的差值。

解题思想是从整数序列两端开始寻找可能存在的低洼边沿。
1)以两端中的小值或等值为低洼最低的边沿,并依次向内比较。
2)若最低边沿内的第一个值大于等于最低边沿,则将该值替换为最低边沿,并重复1)步骤;若小于最低边沿,则这两值的差值即为接的一部分雨水。
3)重复2)步骤,直至left = right -1。
4)最后汇总的雨水即为接的雨水数。

题目解答

func trap(height []int) int {
	water, len := 0, len(height)
	if len <= 2 {
	    return water
	}

	left, right := 0, len-1
	leftMax, rightMax := height[left], height[right]

	for left < right {
		if leftMax <= rightMax {
			left++
			if height[left] < leftMax {
				water += leftMax - height[left]
			} else {
				leftMax = height[left]
			}
		} else {
			right--
			if height[right] < rightMax {
				water += rightMax - height[right]
			} else {
				rightMax = height[right]
			}
		}
	}

	return water
}