42.接雨水(困難)
阿新 • • 發佈:2021-03-23
思路:
觀察可知,當前柱子高度若大於前一根柱子高度,則從棧中彈出,並再往前得到一根柱子的高度,也就是要用到3根柱子。取得較高的2根柱子中間的面積。就此可見,要使用單調棧
class Solution { public int trap(int[] height) { int n=height.length; Deque<Integer> stack=new ArrayDeque<>(); int sum=0; for(int i=0;i<n;i++){ //分為了3個柱子 while(!stack.isEmpty()&&height[i]>height[stack.peekLast()]){ //第二根柱子 int pop=stack.pollLast(); //若前面沒有了(第一根柱子),就退出迴圈,必須要滿足3個柱子 if(stack.isEmpty()) break; //這裡的stack.peekLast()表示第一根柱子 //high表示頭尾2根較矮一根的高度-中間柱子的高度 int high=Math.min(height[i],height[stack.peekLast()])-height[pop]; int width=i-stack.peekLast()-1; sum+=high*width; } stack.addLast(i); } return sum; } }