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
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 }
时间: 2024-10-13 14:13:26