问题描述:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
算法分析:观察下就可以发现被水填满后的形状是先升后降的塔形,因此,先遍历一遍找到塔顶,然后分别从两边开始,往塔顶所在位置遍历,水位只会增高不会减小,且一直和最近遇到的最大高度持平,这样知道了实时水位,就可以边遍历边计算面积。
public class TrapingRainWater { public int trap(int[] height) { int n = height.length; if(n <= 2) { return 0; } int max = -1; int maxIndex = 0; for(int i = 0; i < n; i ++) { if(height[i] > max) { max = height[i]; maxIndex = i; } } int area = 0; int root = height[0]; for(int i = 0; i < maxIndex; i ++) { if(root < height[i]) { root = height[i]; } else { area += (root - height[i]); } } root = height[n-1]; for(int i = n-1; i > maxIndex; i --) { if(root < height[i]) { root = height[i]; } else { area += (root - height[i]); } } return area; } }
时间: 2024-09-30 05:06:19