给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解法一:动态规划
class Solution {
public int trap(int[] height) {
int res = 0;
int[] left_max = new int[height.length];
int[] right_max = new int[height.length];
//位置 i 左边最大值
//left_max[0] = 0
for(int i = 1;i < height.length - 1;i++){
left_max[i] = Math.max(left_max[i - 1],height[i - 1]);
}
for(int i = height.length - 2;i >= 0;i-- ){
right_max[i] = Math.max(right_max[i + 1], height[i + 1]);
}
//最左最右不存水
for(int i = 1;i < height.length - 1;i++){
int min = Math.min(left_max[i],right_max[i]);
if(height[i] < min){
res += (min - height[i]);
}
}
return res;
}
}
执行用时:1 ms, 在所有 Java 提交中击败了75.74%的用户
内存消耗:42 MB, 在所有 Java 提交中击败了62.39%的用户
通过测试用例:322 / 322
解法二:双指针
public int trap(int[] height) {
int sum = 0;
int max_left = 0;
int max_right = 0;
int left = 1;
int right = height.length - 2; // 加右指针进去
for (int i = 1; i < height.length - 1; i++) {
//从左到右更
if (height[left - 1] < height[right + 1]) {
max_left = Math.max(max_left, height[left - 1]);
int min = max_left;
if (min > height[left]) {
sum = sum + (min - height[left]);
}
left++;
//从右到左更
} else {
max_right = Math.max(max_right, height[right + 1]);
int min = max_right;
if (min > height[right]) {
sum = sum + (min - height[right]);
}
right--;
}
}
return sum;
}