方案一:双指针
class Solution {
public int trap(int[] height) {
int n = height.length;
if(height == null || n < 3){
return 0;
}
int ans = 0;
int[] left = new int[n];
int[] right = new int[n];
left[0] = height[0];
right[n-1] = height[n-1];
for(int i = 1; i < n; i++){
left[i] = left[i-1] > height[i] ? left[i-1] : height[i];
}
for(int j = n-2; j >= 0; j--){
right[j] = right[j+1] > height[j] ? right[j+1] : height[j];
}
for(int k = 1; k < n; k++){
ans += Math.min(left[k], right[k]) - height[k];
}
return ans;
}
}
方案二:单调递减栈
class Solution {
public int trap(int[] height) {
int len = height.length;
int ans = 0;
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < len; i++){
while(!stack.empty() && height[i] > height[stack.peek()]){
int cur = stack.pop();
if(stack.empty()){
break;
}
int l = stack.peek();
int r = i;
int h = Math.min(height[l],height[r]) - height[cur];
ans += (r - l - 1) * h;
}
stack.push(i);
}
return ans;
}
}