1.首先观察题目,发现能接水的柱子都是一个碗的形状,这个碗分别由左柱子,碗底柱子,右柱子构成,
2.水的体积为类似于多个长方形拼凑而成,例如下方水的体积就是由两个长方形构成:
面积为 (min(左柱子高度,右柱子高度)-碗底高度) * (左右柱子之间的距离)
感觉这里是有个递归的思想,求两个柱子之间水的体积,先求出最底下的左右柱子中水的体积,图中最底下的就是序号为1的水的体积
3.既然是碗,也就是有着柱子高度先下降然后再上升的规律,所以这边可以利用单调栈来实现,具体实现为遍历柱子将柱子的编号写入栈中,然后将柱子与上个柱子进行比较(与单调栈的栈顶元素进行比较),如果当前柱子高度高于上个柱子,说明这里是有上升趋势的,可以进行装水,
class Solution {
public int trap(int[] height) {
int sum=0;
Deque<Integer> stack = new LinkedList<Integer>();
for(int i=0;i<height.length;i++){
//如果柱子高度不是递减就开始接水 如果栈中没有元素直接入栈
while(!stack.isEmpty()&&height[i]>height[stack.peek()]){
//碗底的高度
int mid=stack.pop();
//如果此时栈中没有元素 则说明缺少左柱子
if(stack.isEmpty()){
break;
}
//左柱子
int left=stack.peek();
//水体积的高度 (min(左柱子,右柱子)-碗底的高度)
int h=Math.min(height[left],height[i])-height[mid];
//宽 左柱子右柱子的距离
int w=i-left-1;
//计算接水面积
sum+=w*h;
}
//柱子高度是递减 继续进栈
stack.push(i);
}
return sum;
}
}