首页 > 其他分享 >力扣---42. 接雨水

力扣---42. 接雨水

时间:2023-03-01 18:35:17浏览次数:36  
标签:--- right 下标 int 42 height 力扣 指针 left

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:
输入: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] <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

一开始想用优先队列试试,结果到最后没想出来。

发现可以先找到一个最高的,之后从两遍向最高的遍历,用两个变量来维护两边相对更高的。

每次都添加一列的雨水。

 

          0   1   2    3         4          5         6          7        8          9         10       11

 如图:第一次遍历找到下标为7的柱子(最高的柱子)

然后从左边开始遍历,一开始指针为0,到下标为1的位置后,更新指针,到2的位置后,res = res + height[left] - height[i]。下标为3:更新指针;下标为4:加2 - 1 = 1,下标为5:加2 - 0 = 2;下标为2:加2 - 1 = 6,7的位置更新指针,然后左遍历结束。

从右边开始遍历,一开始指针为11,下标为10的位置,更新指针。下标为9:加 2 - 1 = 1;下标为8:更新指针;下标为7:更新指针。右遍历结束。

class Solution {
    public int trap(int[] height) {
        int maxIndex = 0;
        for (int i = 0; i < height.length; i ++) {
            maxIndex = height[i] > height[maxIndex] ? i : maxIndex;
        }
        int res = 0;
        int left = 0;
        for (int i = 0; i <= maxIndex; i ++) {
            if (height[i] >= height[left]) {
                left = i;
            } else {
                res += height[left] - height[i];
            }
        }
        int len = height.length - 1;
        int right = len;
        for (int i = len; i >= maxIndex; i --) {
            if (height[i] >= height[right]) {
                right = i;
            } else {
                res += height[right] - height[i];
            }
        }
        return res;
    }
}

 

 进行优化,利用双指针同时向中间遍历,每次移动高度较小的那个指针。

 如果遇到某个位置比另一边更低,则说明该位置必定可以装到另一边的位置。

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        while (left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if (height[left] < height[right]) {
                ans += leftMax - height[left];
                left ++;
            } else {
                ans += rightMax - height[right];
                right --;
            }
        }
        return ans;
    }
}

标签:---,right,下标,int,42,height,力扣,指针,left
From: https://www.cnblogs.com/allWu/p/17169290.html

相关文章

  • background-image
     CreateTime--2017年12月26日14:51:21Author:Marydonbackground-image1.background-image:url()作用:设置背景图片语法:background-image:url(path)说明:path既可以是相对......
  • 进程通信3-信号
    1.信号的概念信号是Linux进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方......
  • iOS应用发布ITMS-90704错误解决
    iOS应用发布ITMS-90704错误解决今天第一次用XCode9GM版打包上传应用。貌似上传的过程更简单了。选择“Automaticallymanagesigning”(自动管理签名)后它就直接显示一个......
  • JAVAWEB-NOTE05-Maven
    目录概述提供了一套标准的项目化结构提供了一套标准化的构建流程提供了一套依赖管理机制简介安装配置安装基本使用常用命令生命周期IDEA配置Maven配置环境Maven坐标IDEA新......
  • 2023-03-01 react-native 实现 复制功能 @react-native-community/clipboard 报错:Type
    我的react-native(下称rn)版本为0.68,要实现这个功能主要用到rn的clipboard,在21年的时候他就已经提示clipboard会在未来的版本中上去掉,官方的建议是不要再从react-native引入,......
  • k8s-container unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock
    crictlps报runtimeconnectusingdefaultendpoints:[unix:///var/run/dockershim.sockunix:///run/containerd/containerd.sockunix:///run/crio/crio.sockunix:///......
  • iOS应用发布ITMS-90704错误解决
    iOS应用发布ITMS-90704错误解决今天第一次用XCode9GM版打包上传应用。貌似上传的过程更简单了。选择“Automaticallymanagesigning”(自动管理签名)后它就直接显示一......
  • 【Kaggle】Telco Customer Churn 电信用户流失预测案例 ----数据预处理
    任务目标:  对于电信运营商来说,用户流失有很多偶然因素,不过通过对用户属性和行为的数字化描述,我们或许也能够在这些数据中,挖掘导致用户流失的“蛛丝马迹”,并且更重要的一......
  • 流程控制-循环结构
    1、LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。 基础语法[loop_label:]LOOP循环执行的语......
  • Docker 容器将在“docker run -d”后自动停止
    根据我目前阅读的教程,使用“dockerrun-d”将从图像启动一个容器,并且该容器将在后台运行。这就是它的样子,我们可以看到我们已经有了容器ID。root@docker:/home/ro......