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.
Example
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
public class Solution {
/**
* @param heights: an array of integers
* @return: a integer
*/
public int trapRainWater(int[] heights) {
int[] res = new int[heights.length];
int max = 0;
for(int i = 0; i < heights.length; i++) {
max = Math.max(max, heights[i]);
res[i] = max;
}
max = 0;int t = 0;
for(int i = heights.length - 1; i >= 0; i--) {
max = Math.max(max, heights[i]);
t += Math.min(max, res[i]) - heights[i];
}
return t;
}
}
另一种方法,可以使用双指针,并且储存左侧/右侧遇到的最大值。当在i点lmax>rmax时,此时可以判定 i点左侧的最大值大于等于lmax,因此对于一个大于或者等于lmax的其他值,i点的最大值取lmax和rmax中较小的一个,所以肯定会是rmax。此时就可以得到i点的积水量。然后i指针前移/后移。
public class Solution {
/**
* @param heights: an array of integers
* @return: a integer
*/
public int trapRainWater(int[] heights) {
int l = 0, r = heights.length - 1;
int lmax = 0, rmax = 0;
int res = 0;
while(l < r) {
lmax = Math.max(lmax, heights[l]);
rmax = Math.max(rmax, heights[r]);
if(lmax > rmax) {
res += rmax - heights[r];
r--;
} else {
res += lmax - heights[l];
l++;
}
}
return res;
}
}