暴力解法

将此节点左右两个最高峰找到,如果都比自己小则为自己 两个最高峰中最小的那个才是自己能装的最大的水 将自己的峰减去即可
java
int trap(int[] height) {
int n = height.length;
int res = 0;
for (int i = 0; i < n-1; i++) {
int l_max = 0;
int r_max = 0;
for (int j = i; j < n; j++) {
r_max = Math.max(r_max, height[j]);
}
for (int j = i; j >=0 ; j--) {
l_max = Math.max(l_max, height[j]);
}
res += Math.min(r_max, l_max) - height[i];
}
return res;
}第二种方法:用备忘录的方式,将该节点的左右最高点存在两个新的数组中,然后直接相加,不用每一次每个节点都要去遍历一遍 就是左最高数组记录着每个结点左边最大值;右最高数组记录着每个结点右边最大值 最后进行左右最高数组小的那个跟该节点相减即可
java
public static int trap2(int[] height) {
if (height.length == 0){
return 0;
}
int n = height.length;
int res = 0;
int[] l_max = new int[n];
int[] r_max = new int[n];
l_max[0] = height[0];
r_max[n-1] = height[n-1];
for (int i = 1; i < n; i++) {
l_max[i] = Math.max(height[i], l_max[i-1]);
}
for (int i = n-2; i >= 0 ; i--) {
r_max[i] = Math.max(height[i], r_max[i+1]);
}
for (int i = 0; i < n-1; i++) {
res += Math.min(l_max[i], r_max[i]) - height[i];
}
return res;
}第三种方法:接雨水,用双指针方式,左右往中间移动,重点是:找出左右最高的山峰中小的那个与当前节点之间的差额,即可向下移动 

java
public static int trap3(int[] height) {
int left = 0;
int right = height.length -1;
int l_max = 0;
int r_max = 0;
int res = 0;
while (left < right) {
l_max = Math.max(l_max, height[left]);
r_max = Math.max(r_max, height[right]);
if (l_max < r_max) {
res += l_max - height[left];
left++;
} else {
res += r_max - height[right];
right--;
}
}
return res;
}