这一题的难度相对来说比较小,只要找到左端最大和右端最大的情况即可。基础的动态规划问题。
class Solution {
public int trap(int[] height) {
int n= height.length;
//左端最大值
int leftMax[] = new int[n];
//右端最大值
int rightMax[] = new int[n];
//由于第一个点和最后一个点不需要考虑,因此直接跳过
for(int i=1;i<n;++i){
leftMax[i] = Math.max(leftMax[i-1], height[i-1]);
}
// System.out.println(Arrays.toString(leftMax));
for(int i=n-2;i>=0;--i){
rightMax[i] = Math.max(rightMax[i+1], height[i+1]);
}
// System.out.println(Arrays.toString(rightMax));
int ans=0;
//遍历的时候将左端点和右端点的最小值与当前值比较,如果是小则为0,大则累计
for(int i=1;i<n-1;++i){
ans+=Math.max((Math.min(leftMax[i], rightMax[i])-height[i]), 0);
}
return ans;
}
}