TrappingRainWater

问题描述:

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;
	}

}

 

posted @ 2016-08-05 16:35  32ddd  阅读(402)  评论(0编辑  收藏  举报