题解 | #接雨水问题#
接雨水问题
http://www.nowcoder.com/questionTerminal/31c1aed01b394f0b8b7734de0324e00f
public class Solution {
public static long maxWater (int[] arr) {
if(arr.length <= 2){//先判断是否可以容纳水滴
return 0;
}
int sum = 0;
int start = 0,end = arr.length - 1;
while(start < end){//总的边界条件
int i = 0;
int temp = 0;
//从两侧最小的值开始往中间遍历,分两种情况:
//如果下一个值小于起始值,那么遍历计算水滴;
//如果下一个值大于起始值,那么遍历寻找最高点,从最高点开始遍历计算水滴。
if(arr[start] <= arr[end]){
temp = start;
i = start + 1;
while(i < end && arr[i] > arr[start]){
if (arr[i] >= arr[temp]){
temp = i;
}
i++;
}
if (start != temp){//找到范围内最高点
start = temp;
}
while(i < end && arr[i] < arr[start]){
sum = sum + arr[start] - arr[i];
i++;
}
start = i;
}else{
temp = end;
i = end - 1;
while(start < i && arr[i] > arr[end]){
if (arr[i] >= arr[temp]){
temp = i;
}
i--;
}
if (end != temp){//找到范围内最高点
end = temp;
}
while(start < i && arr[i] < arr[end]){
sum = sum + arr[end] - arr[i];
i--;
}
end = i;
}
}
return sum;
}
}