问题
例子
思路
-
方法1
$$$$
按列求【第一列和最后一列由于缺乏边界,不能存水】
对于每一列i,i左边最高为h1,i右边最高为h2,h=Math.min(h1,h2)
如果h>该列高,则该列存水:(h-列高)*宽=h-列高【宽为1】 -
方法2
$$$$
代码
//方法1
class Solution {
public int trap(int[] arr) {
int len = arr.length;
if(len<=2) return 0;
//left[i]为i左边最大的值
int[] left = new int[len];
//right[i]为i右边最大的值
int[] right = new int[len];
for(int i=1; i<=len-1; i++)
left[i] = Math.max(left[i-1],arr[i-1]);
for(int i=len-2; i>=0; i--) {
right[i] = Math.max(right[i+1],arr[i+1]);
}
int res = 0;
//按列求,第一列和最后一列由于缺乏边界,所有不能存水
for(int i=1; i<=len-2; i++) {
int high = Math.min(left[i], right[i]);
if(high>arr[i]) res += high-arr[i];
}
return res;
}
}
//方法2