2025年- H37-Lc145 --42. 接雨水(单调栈)--Java版
1.题目描述
2.思路
(1)方法一:用双指针实现
(2)方法二:用单调栈实现
1)维护一个单调递增的栈,当前遍历的元素和栈顶元素进行比较(要求遍历的元素要大于栈顶元素),否则,就将当前遍历的元素入栈。
2)如果满足了当前遍历的元素大于栈顶元素(也就是中间的mid元素),栈顶元素出栈,接下来mid的右边第一个元素成为栈顶元素。
3)计算容器的高度
4)计算容器的宽度,此处要-1。(比如横坐标是3,4,5。5-3-1=1。这边的1就是凹槽的宽度。
5)最后计算面积。
3.代码实现
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;public class H42 {public int trap(int[] height) {Deque<Integer> dq=new LinkedList<>();int area=0;int n=height.length;int[] ans=new int[n];//存储下标索引for(int i=0;i<n;i++) {while (!dq.isEmpty()&&height[i]>height[dq.peek()]) {//1)维护一个单调递增的栈,当前遍历的元素和栈顶元素进行比较(要求遍历的元素要大于栈顶元素),否则,就将当前遍历的元素入栈。int mid=dq.pop();// 凹槽底部if(dq.isEmpty()) break;//左右寻找比当前元素小的元素。int postIndex=dq.peek(); //赋值给 dq.peek() 弹出之前保存的索引位置。//2)如果满足了当前遍历的元素大于栈顶元素(也就是中间的mid元素),栈顶元素出栈,接下来mid的右边第一个元素成为栈顶元素。//3)计算容器的高度//height[i] 是当前柱子,作为 右边界//height[postIndex] 是栈顶未弹出的元素,作为 左边界int shortHeight=Math.min(height[i],height[postIndex])-height[mid];//4)计算容器的宽度,此处要-1。(比如横坐标是3,4,5。5-3-1=1。这边的1就是凹槽的宽度。int weight=i-postIndex-1;// 5)最后计算面积。if (shortHeight > 0) {area+=shortHeight*weight;}}dq.push(i);}return area;}public static void main(String[] args){H42 test =new H42();int[] height={0,1,0,2,1,0,1,3,2,1,2,1};int res=test.trap(height);System.out.println(res);}
}