最直接的方式是计算每个点蓄水量,每个点蓄水量也很好计算,找到左右两侧最高点,然后取小的值与当前位置的高求差就欧了。当然了这是暴力破解的思路,时间复杂度是n2,网上有挺多时间复杂度为n的解决思路,有些超复杂,我是觉得一到算法题最起码的最直接的解决办法还是要明白的,这样才算真正认识这道题。
代码:
public int trap_force(int[] height) {
int len = height.length;
int res = 0,min;
for (int i = 1; i < len - 1; i++) {
int left = heighterIndex(i, true, height);
int right = heighterIndex(i, false, height);
if (left > height[i] && right > height[i]) {
min = left < right ? left : right;
res += min - height[i];
}
}
return res;
}
public int heighterIndex(int index, boolean isLeft, int[] height) {
int big = height[index];
if (isLeft) {
for (int i = index - 1; i >= 0; i--) {
if (height[i] > big)
big = height[i];
}
} else {
for (int i = index + 1; i < height.length; i++) {
if (height[i] > big)
big = height[i];
}
}
return big;
}