☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水

---------------🎈🎈42. 接雨水 题目链接🎈🎈-------------------

解法1 前后缀分解

在这里插入图片描述

维护一个前缀(左侧最高)后缀(右侧最高)数组
把每一个小区间看做一个桶,桶的容量取决于左右壁中最低的那一个Min(leftmax,rightmax)
左壁就是当前这块及其左侧高度的最大值:前缀 leftmax
右壁就是当前这块及其右侧高度的最大值:后缀 rightmax
最终能装的水 = 当前小桶的容量-当前小柱子高度

时间复杂度O(N)
空间复杂度O(N)

class Solution {
    public int trap(int[] height) {
        // 把每一个小区间看做一个桶,桶的容量取决于左右壁中最低的那一个Min(leftmax,rightmax)
        // 左壁就是当前这块及其左侧高度的最大值:前缀 leftmax
        // 右壁就是当前这块及其右侧高度的最大值:后缀 rightmax
        // 能装的水 = 桶容量-柱子高度

        int[] leftmax = new int[height.length]; // 左边的最大高度
        int[] rightmax = new int[height.length]; // 右边的最大高度
        int templeftmax = 0;
        for(int i = 0; i < height.length;i++){ // 前缀数组
            if(height[i] > templeftmax){
                templeftmax = height[i];
            }
            leftmax[i] = templeftmax;
        }

        int temprightmax = 0;
        for(int i = height.length-1; i >=0;i--){ // 后缀数组
            if(height[i] > temprightmax){
                temprightmax = height[i];
            }
            rightmax[i] = temprightmax;
        }

        int totalWater = 0;
        // 同时遍历前后缀数组,两者取取Min即为桶内可以容纳的高度。之后减去筒高度即为水的高度,累加即可
        for(int i = 0; i< height.length; i++){
            totalWater += Math.min(leftmax[i],rightmax[i])-height[i];
        }
        return totalWater;
    }
}   

解法2 双指针

在这里插入图片描述
多做做吧 不行就看看动图

双指针法👿
while(left<right)
每次更新前缀最大值和后缀最大值
⭐️当 前缀最大值 < 后缀最大值时:当前的桶容量肯定为前缀最大值
⭐️当 后缀最大值 < 前缀最大值时:当前的桶容量肯定为后缀最大值

之后就更新totalwater = 当前桶容量- 底部高度即可

时间复杂度O(N)
空间复杂度O(1)
⭐️⭐️

class Solution {
    public int trap(int[] height) {
        int totalWater = 0;
        // 初始化双指针 一个指头一个指尾
        int left = 0;
        int right = height.length-1;
        // 前缀最大值和后缀最大值
        int preMax =0;
        int backMax = 0;
        
        // 双指针left< right遍历
        while(left < right){
            // 更新前缀最大值和后缀最大值
            preMax = Math.max(preMax, height[left]);
            backMax = Math.max(backMax, height[right]);
            // 1.当:前缀最大值 小于 后缀最大值:说明桶容量一定为前缀最大值!!!
            if(preMax < backMax){
                totalWater += (preMax-height[left]);  // 计算totalwater = 桶容量-柱子高度
                left++;
            }
            // 2.当:后缀最大值 小于 前缀最大值:说明桶容量一定为后缀最大值!!!
            if(preMax >= backMax){
                totalWater += (backMax-height[right]);  // 计算totalwater = 桶容量-柱子高度
                right--;
            }
            // 3.前缀最大值和后缀最大值相等的时候,随便归入一类就行
        }
        return totalWater;

    }
}

相关推荐

  1. leetcode-42. 雨水指针,前缀)

    2024-03-24 18:28:02       11 阅读
  2. 【重点】【指针42. 雨水

    2024-03-24 18:28:02       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 18:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 18:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 18:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 18:28:02       18 阅读

热门阅读

  1. Kafka系列之:Exactly-once support

    2024-03-24 18:28:02       18 阅读
  2. 海量数据处理和提高系统的并发能力的一些方案

    2024-03-24 18:28:02       22 阅读
  3. 如何在ubuntu 18.04中升级python 3.6到3.7

    2024-03-24 18:28:02       20 阅读
  4. CCSK-云计算安全基础知识认证

    2024-03-24 18:28:02       20 阅读
  5. OpenCV中如何进行模板匹配?

    2024-03-24 18:28:02       20 阅读
  6. 解释C语言中的函数及其参数传递方式

    2024-03-24 18:28:02       23 阅读
  7. 深入理解PHP+Redis实现分布式锁的相关问题

    2024-03-24 18:28:02       18 阅读
  8. 樊登读书-《终生成长》【视频笔记 +个人思考】

    2024-03-24 18:28:02       16 阅读
  9. Postman使用json进行接口关联

    2024-03-24 18:28:02       20 阅读
  10. vue前端面试题

    2024-03-24 18:28:02       15 阅读
  11. 1010: 【C1】【循环】求平均年龄

    2024-03-24 18:28:02       21 阅读
  12. 页面中异步请求的数据,python爬虫能爬到吗

    2024-03-24 18:28:02       19 阅读
  13. Android 带html标签文本添加自定义超链接跳转

    2024-03-24 18:28:02       17 阅读