/**
* 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.
*
* Tags: Array, Stack, Two pointers
*/
class TrappingRainWater {
public static void main(String[] args) {
}
/**
* Calculate the area of all and blocks
* Then return all - block to get the trapped water
*
* Start from two sides
* If min of A[l] and A[r] is larger than current level
* Update all and curLevel
* Then move lower pointer towards center
*/
public int trap(int[] A) {
if (A == null || A.length == 0) return 0;
int l = 0;
int r = A.length - 1;
int level = 0;
int all = 0;
int block = 0;
while (l <= r) { // note l <= r to include the last block
// update area
int curLevel = Math.min(A[l], A[r]);
if (curLevel > level) {
all += (curLevel - level) * (r - l + 1);
level = curLevel;
}
// move index and update block
if (A[l] < A[r]) block += A[l++];
else block += A[r--];
}
return all - block;
}
public int trap2(int[] A) {
int n = A.legnth;
if (n < 3) return 0;
// scan from both left and right
int left = 0, right = n - 1, highest = 0, water = 0;
while (left < right) {
int curr = height[left] < height[right] ? height[left++] : height[right--];
if (curr < highest) {
// add trapped water
water += highest - curr;
} else {
highest = curr; // update highest level
}
}
return water;
}
}