###### tags: `Leetcode` # 单调栈 :::spoiler 42.接雨水 ### Java ```java class Solution { public int trap(int[] height) { Stack<Integer> s = new Stack<Integer>(); int n = height.length; int[] left = new int[n];//当前索引,对应的 int[] right = new int[n]; for(int i = 0; i < n; i++){ left[i] = -1; right[i] = -1; } //维护一个单调递减栈,栈、left、right 存放的都是索引。 for(int i = 0; i < n;i++){ while(!s.empty() && height[i] >= height[s.peek()]){ int a = s.pop(); right[a] = i; //第 a 置 i;i对应的高度比 a 对应高度高。 } if(!s.empty()){ //i 对应的高度比peek对应的高度低,说明i的左边第一个比i对应高度的高即是peek对应的高度 //(单调递减栈栈顶是最新进入的比较高的) left[i] = s.peek(); } s.push(i); } int sum = 0; for(int i = 0; i < n;i++){ if(left[i] == -1 || right[i] == -1)continue;//左右都没有比当前高度高的,接不了雨水。 sum +=(min(height[left[i]],height[right[i]])- height[i])*(right[i]-left[i]-1); } return sum; } public int min(int i,int j){ if(i>j)return j; return i; } } ``` :::