数据结构与算法-算法-42. 接雨水

题目:

42. 接雨水 - 力扣(LeetCode)42. 接雨水 - 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1:[https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/rainwatertrap.png]输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2:输入:height = [4,2,0,3,2,5]输出:9 提示: * n == height.length * 1 <= n <= 2 * 104 * 0 <= height[i] <= 105https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked总结:

利用一个单调栈,一旦触发弹栈就能放雨水。但是要注意边界问题。

宽度如和计算。雨水的高度如和计算。

代码示例:

java 复制代码
/**
 * <h3>接雨水 - 单调栈</h3>
 */
public class TrappingRainWaterLeetcode42 {
    public static void main(String[] args) {
        System.out.println(trap(new int[]{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1})); // 6
        //System.out.println(trap2(new int[]{4, 2,  9, 3, 2, 5})); // 9
    }

    static int trap(int[] heights){
      LinkedList<Data> stack = new LinkedList<>();
      int sums = 0;
      for (int i = 0; i < heights.length; i++) {
          Data rights = new Data(heights[i], i);//右边界
          //要保证栈不为空。为了单调性,栈顶的高度比 右边界的小。才入栈
          while(!stack.isEmpty() && stack.peek().height < rights.height){
              Data pop = stack.pop();//弹出的
              Data left = stack.peek();//现在的栈顶
              if(left != null){//不是最左边界才能放
                  //只要触发弹栈。就标明有位置放雨水

//宽度计算,right 的索引减去 left 的索引-1。比如:3,1.3-1=2-1=1宽度是 1
                  int width = rights.i - left.i - 1;
//高度计算
                  int height = Math.min(left.height, rights.height) - pop.height;
                  sums += width * height;
              }
          }

          stack.push(rights);

      }
        return sums;
    }



    static class Data{
        int height;
        int i;  // 索引

        public Data(int height, int i) {
            this.height = height;
            this.i = i;
        }

        @Override
        public String toString() {
            return String.valueOf(height);
        }
    }
}

视频讲解:
进阶数据结构和算法-336-接雨水-Leetcode42_哔哩哔哩_bilibili进阶数据结构和算法-336-接雨水-Leetcode42是大厂必备数据结构与算法Java视频教程(下篇),java高级程序员必学的数据结构与算法的第182集视频,该合集共计200集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1rv4y1H7o6?spm_id_from=333.788.videopod.episodes&vd_source=359511ad49b33d059c0e1fac0e8145e4&p=182