接雨水
问题陈述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

如图,可接下6个单位的雨水。
思路分析
利用单调栈,单调栈就是永远保证栈内元素单调递增或递减。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution{ public int trap(int[] height){ if(height==null){ return 0; } Stack<Integer> stack=new Stack<>(); int ans=0; for(int i=0;i<height.length;i++){ while(!stack.isEmpty()&&height[stack.peek()]<height[i]){ int curIdx=stack.pop(); while(!stack.isEmpty()&&height[stack.peek()]==height[curIdx]){ stack.pop(); } if(!stack.isEmpty()){ int stackTop=stack.peek(); ans += (Math.min(height[stackTop], height[i]) - height[curIdx]) * (i - stackTop - 1);
} } stack.add(i); } return ans; } }
|