给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
class Solution {
public int trap(int[] height) {
int sum = 0;
int startIndex = 0, middleIndex = 1, endIndex = 2;
while(startIndex < height.length - 2 && middleIndex < height.length - 1 && endIndex < height.length){
if(height[middleIndex] >= height[startIndex]){
startIndex++;
middleIndex++;
endIndex++;
}else{
if(height[endIndex] <= height[middleIndex]){
middleIndex++;
endIndex++;
}else{
if(endIndex < height.length - 1 && height[endIndex + 1] >= height[endIndex]){
endIndex++;
}else{
if(height[endIndex] < height[startIndex]){
int maxIndex = endIndex;
for(int i = endIndex; i < height.length; i++){
if(height[i] >= height[startIndex]){
maxIndex = i;
break;
}else if(height[i] > height[maxIndex]){
maxIndex = i;
}
}
endIndex = maxIndex;
}
int min = Math.min(height[startIndex], height[endIndex]);
for(int i = startIndex + 1; i < endIndex; i++){
if(height[i] < min){
sum += (min - height[i]);
}
}
startIndex = endIndex;
middleIndex = startIndex + 1;
endIndex = startIndex + 2;
}
}
}
}
return sum;
}
}