Trapping Raining Water 解答

Question

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.

Solution

referrence

Key to the solution is to know that for each point a[i], the max are is calculated by:

min(left,right) – a[i]

left is the maximum height before a[i], right is the maximum height after a[i].

Therefore, we can create two arrays to record left most height and right most height for each point. Time complexity O(n).

 1 public class Solution {
 2     public int trap(int[] height) {
 3         if (height == null || height.length < 1)
 4             return 0;
 5         int length = height.length;
 6         int[] leftMost = new int[length];
 7         int[] rightMost = new int[length];
 8         // First, find left biggest hight
 9         leftMost[0] = 0;
10         for (int i = 1; i < length; i++)
11             leftMost[i] = Math.max(leftMost[i - 1], height[i - 1]);
12         
13         // Then, find right biggest hight
14         rightMost[length - 1] = 0;
15         for (int i = length - 2; i >= 0; i--)
16             rightMost[i] = Math.max(rightMost[i + 1], height[i + 1]);
17         
18         // Calculate sum
19         int result = 0;
20         for (int i = 0; i < length; i++) {
21             int tmp = Math.min(leftMost[i], rightMost[i]) - height[i];
22             if (tmp > 0)
23                 result += tmp;
24         }
25         return result;
26     }
27 }

 

posted @ 2015-10-08 07:42  树獭君  阅读(183)  评论(0编辑  收藏  举报