Leetcode42.接雨水——双指针法

2023-11-15

文章目录

引入

本题是这样的:

42.接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述

题目给出的图片一眼就能了然题目要问的是什么。

很明显,某一列能装多少水,取决于该列左侧和右侧的高度的最小值。
最无脑的做法就是,对每一列求其左右的最大值,也就是用额外的两个O(N)大小的数组空间来存储每一列的最大值和最小值。
该方法时间复杂度也是O(N),不过是需要2-3次遍历数组(求最大值一次,最小值一次,然后求盛水高度一次,后面两次可以合并)。

不过,我希望能够一次遍历完成计算,并且不需要使用额外的数组空间,一开始我是这样写的:

class Solution {
    public int trap(int[] height) {
        int output=0;
        int left=height[0];
        for(int i=1;i<height.length;i++){
            if(height[i]<left) output+=(left-height[i]);
            else{
                left=height[i];
            }
        }
        return output;
    }
}

这样写,值考虑左侧的值,并没有考虑右侧值是否比左侧值更小,当然是错的。不过提供了一种思路,是否能够用相似的方法一次遍历并且不实用额外的数组空间呢?

双指针法

由之前的解法,我们看到,只考虑了一侧的值(左侧),而忽略了另一侧的值,这样是不可取的。因为水位高度取决于最低的那块板子。

所以,我们想到,是否能用双指针,分别来指向左右两侧,然后比较左侧目前的max_height大还是右侧目前的max_height大。其具体步骤是这样的:

  1. left=0, right=length-1;//两个指针从左右分别开始。
  2. left_max_height=height[left],right_max_height=height[right];记录下左右两边的目前指针指向的最高的高度。
  3. 当left<right的时候,判断左边的最大高度大还是右边的最大高度大。如果是右边的最大高度更大,那么左边无论如何都会装上水,因为它是矮的那一块。
  4. 不妨假设是左边的最大高度小一点,判断目前的height和left_max_height的关系。如果目前的高度比left_max_height高度更高,再次进入步骤3。否则计算盛水量:left_max_height-height。指针left++,重复步骤4直到不满足left<right。
{
    int left = 0, right = height.length - 1;
    int ans = 0;
    int left_max_height = 0, right_max_height = 0;
    while (left < right) {
        if (height[left] < height[right]) {
            if(height[left] >= left_max_height) {
				left_max_height = height[left];
			}else{
				ans += (left_max_height - height[left]);
			}
            ++left;
        }
        else {
        	if(height[right] >= right_max){
        		right_max_height = height[right];
        	}else{
        		ans += (right_max_height - height[right]);
        	} 
            --right;
        }
    }
    return ans;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode42.接雨水——双指针法 的相关文章

随机推荐

  • 多行fieldname字段的内容串联起来,用逗号分隔

    SELECT UserId RoleName stuff SELECT RoleName FROM temp AS t WHERE t UserId temp UserId FOR xml path 1 1 into temp1 FROM
  • 2022第十三届蓝桥杯省赛B组Python

    本来蓝桥杯是 5 道填空题 5 道编程题 但是这一届突然变成了 2 道填空题和 8 道编程题 文章目录 试题 A 排列字母 试题 B 寻找整数 试题 C 纸张尺寸 试题 D 数位排序 试题 E 蜂巢 试题 F 消除游戏 试题 G 全排列的价
  • 第三篇 制作数据集

    文章目录 摘要 1 选择主题 2 制作数据集 2 1 视频截取 2 1 通过搜索 3 统一名字和格式 3 1 统一名字 3 2 统一图片格式 4 制作测试集 5 关于数据集的一些面试问题 5 1 别不平衡产生原因 5 2 如何解决类别不平衡
  • 解决 ASP.NET 编辑错误"CS0006: 未能找到元数据文件C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5...

    问题背景 公司最近给我配置了一台新Windows 7旗舰版的电脑 这几天一直在迁移文件 因为新电脑上安装Sqlserver r2失败 解决方法是要安装一个800 MB的安装包 由于最近手上事情比较多也就没有解决这个事情 直接使用VS默认的S
  • 2023-5-26第二十六天

    tone语气 风格 气氛 indent缩排 instruct讲授 指导 指示 命令 motif主题 主旨 interpret翻译 说明 理解 interrupt distraction消遣 分散注意力的事 complicated复杂的 难懂
  • 完美解决微信小程序van-field left-icon自定义图片

    实现效果
  • 可以ping通但是xshell连不上_金万维宽带通动态域名解析在客户端解析不对,怎么办?...

    今天上午 咱们有一个使用金万维宽带通动态域名解析服务的用户反馈 直接Ping金万维动态域名解析服务的域名 发现Ping到的IP和实际的动态公网IP不一致 具体如图 通过上图 客户反馈 宽带通软件上的IP和路由器WAN口IP是一样的 但是Pi
  • python入门--抓取网页文字

    要抓取网页文字 我们需要使用Python的一个库 叫做requests 这个库可以帮助我们向网站发送请求 获取网站的内容 下面是一个简单的示例代码 用于抓取一个网页的文字 import requests import re import o
  • 车联网总结

    一句话 根据车联网产业技术创新战略联盟的定义 车联网是以车内网 车际网和车载移动互联网为基础 按照约定的通信协议和数据交互标准 在车 X X 车 路 行人及互联网等 之间 进行无线通讯和信息交换的大系统网络 是能够实现智能化交通管理 智能动
  • linux下删除asm磁盘,Linux平台下Oracle ASM磁盘组添加磁盘

    以下为Linux平台下Oracle ASM磁盘组添加磁盘的主要操作 多路进软件使用的是HDS的 一 操作系统设置 1 从存储映射磁盘到服务器 然后重启 扫描磁盘 opt D bin dlnkmgr view lu 2 扫描到新的磁盘后 两个
  • 递归递归递归

    function DG htmlDom n n for var i 0 i lt htmlDom length i var navSubmenu htmlDom i nav submenu var item htmlDom i if nav
  • 2023年Java面试题_Mongodb

    Index Mongodb 1 基本概念 1 1 文档 1 2 集合 1 3 数据类型 1 4 id 和 ObjectId 2 基本操作 3 索引介绍 4 应用场景 4 1 MySQL VS MongoDB 4 2 应用场景 4 3 压测结
  • MySQL——关系型数据库管理系统

    目录 01 数据库 02 SQL 结构化查询语言 关于SQL语句的分类 03 MySQL常用命令 1 退出mysql exit 2 查看mysql中有哪些数据库 3 选择使用某个数据库 4 创建数据库 5 查看某个数据库下有哪些表 6 查看
  • 操作系统读书笔记- 01 x86系统架构概览.md-html

    x86系统架构概览 真看不懂了 今天就写这些吧 2 0 处理器工作模式 一般来讲 x86 64处理器具有5种工作模式 实模式 Real address Mode 处理器以16位8086的方式工作 只能以简单的段地址 偏移地址方式进行寻址 地
  • 在Javascript中怎样判断用户按下的是回车键?

  • 本地chrome,访问(超链接跳转)本地文件解决方案

    问题和背景描述 1 用html php写了一个脚本 先从数据库中获取pdf文件的路径 然后将这个路径映射成一个html中的超链接 但是我在浏览器中点击这个超链接 死活跳转不了 2 经过多方调查 和搜索 最终找到了问题的原因 chrome中有
  • Java加密算法有几种?

    前言 编程中常见的加密算法有以下几种 你都知道是哪些吗 它们在不同场景中分别有应用 除信息摘要算法外 其它加密方式都会需要密钥 密钥 密钥 key 又常称金钥 是指某个用来完成加密 解密 完整性验证等密码学应用的秘密信息 密钥分类 加解密中
  • centos7更换和升级JDK版本

    卸载 查询是否安装 jdk rpm qa grep jdk rpm qa grep java 卸载安装的 jdk yum y remove java yum 查询支持的版本 可以先更新一下 yum 源 以便支持最新版本 yum y upda
  • 机器学习之线性回归

    什么是线性回归 线性回归利 回归 程 函数 对 个或多个 变量 特征值 和因变量 标值 之间 关系进 建模的 种分析 式 一般只有一个特征值的称之为单变量回归 多个特征值的称之为多变量回归 线性回归 线性回归可以分为两类 线性关系和非线性关
  • Leetcode42.接雨水——双指针法

    文章目录 引入 双指针法 引入 本题是这样的 42 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图 计算按此排列的柱子 下雨之后能接多少雨水 题目给出的图片一眼就能了然题目要问的是什么 很明显 某一列能装多少水 取决于该列左