[Leetcode] 接雨水(相向双指针)

news2024/9/22 10:05:36

可以直接移步大神的解题思路,非常详细 -> 盛最多水的容器 接雨水_哔哩哔哩_bilibili

11. 盛最多水的容器 https://leetcode.cn/problems/container-with-most-water/description/
42. 接雨水 https://leetcode.cn/problems/trapping-rain-water/description/

11. 盛最多水的容器

解题思路:求区域面积的最大值,矩形的面积取决于底和高,高度的最大值未知,底的最大值已知,所以可以从底边最大开始,即左右各一枚指针。而高度取决于更小的高度,提高更小的高度才有可能找到更大的面积,所以哪边低哪边的指针往中间走一步,如果面积更大则更新,直到左右指针相邻。

class Solution:
    def maxArea(self, height: List[int]) -> int:
        n = len(height)
        left = 0
        right = n-1
        maxarea = 0

        while left < right:
            area = min(height[left],height[right]) * (right - left)
            maxarea = max(maxarea,area)
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return maxarea

42.接雨水

想破了脑袋,把局部最大值都拿出来然后没有覆盖“高-低-高”这种情况,而低本身可以是各种组合,其实如果能想到一侧的最大值挡着水就不会流出去就思路通畅了,这样高度就取决于另一边。

解题思路:计算每个位置的水量,取决于往左边看最高的柱子高度,以及往右边看最高的柱子高度,两者之间的较小者。即使相邻的左(右)侧柱子更低,因为更左(右)侧有更高的柱子,水不会流出去。

方法一:前缀最大值列表和后缀最大值列表

创建一个前缀列表,for循环从左往右,记录每个位置左侧已出现过的柱子的最大高度;

创建一个后缀列表,for循环从右往左,记录每个位置右侧已出现过的柱子的最大高度;

在每个位置比较上述两个值谁更小,把该位置的水量加到总和中。

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        n = len(height)
        pre_max = [0]*n
        suf_max = [0]*n
        pre_max[0] = height[0]
        suf_max[-1] = height[-1]

        for i in range(1,n):
            pre_max[i] = max(pre_max[i-1],height[i])
        
        for i in range(n-2,-1,-1):
            suf_max[i] = max(suf_max[i+1],height[i])
            
        for i in range(n):
            ans += min(pre_max[i],suf_max[i]) - height[i]

        ### Or use zip()
        # for pre,suf,h in zip(pre_max,suf_max,height):
        #     ans += min(pre,suf) - h

        return ans

方法二:相向双指针

相比于方法一使用更少内存,不用两个列表,改用两个变量。

指针1从左往右,记录左半边已出现的最高柱子;

指针2从右往左,记录右半边已出现的最高柱子;

一开始,指针1在最左侧,指针2在最右侧,哪半边的最高柱子的高度更小则该位置水量高度已确定(另一侧的最大值保证了水不会流出去),水量记入总和,该侧指针往中间移动一步,就这样直到两边的指针重合。

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        n = len(height)
        left = 0
        right = n-1
        pre_max = height[0]
        suf_max = height[-1]

        while left <= right:   
            pre_max = max(pre_max,height[left])
            suf_max = max(suf_max,height[right])
            
            if pre_max < suf_max:
                ans += pre_max - height[left]
                left += 1
            else:
                ans += suf_max - height[right]
                right -= 1
                
        return ans

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发编程之LockSupport的 park 方法及线程中断响应

并发编程之LockSupport的 park 方法及线程中断响应-CSDN博客

STM32CubeIDE

文章目录 Stm32CubeIDE开发环境介绍获取路径 新建工程 Stm32CubeIDE 开发环境介绍 也就是说IDE是集合了CubeMX 和MDK5的。 区别&#xff1a; 获取路径 官网&#xff1a;https://www.st.com/en/development-tools/stm32cubeide.html A盘路径&#xff1a;A盘\6&#xff0c;软…

Signed distance fields (SDFs) and Truncated Signed Distance Field(TSDF)

1. Signed distance fields (SDFs) 笔记来源&#xff1a; [1] Signed distance fields (SDFs) [2] Signed Distance Function (SDF): Implicit curves or surfaces [3] Ray Marching and Signed Distance Functions [4] Truncated Signed Distance Function [5] Wiki/Signed d…

个人旅游网(4)——功能详解——收藏功能

文章目录 一、收藏排行榜功能1.1、接口详解1.1.1、findRouteList 二、收藏功能2.1、接口详解2.1.1、find&#xff08;用于判断当前旅游路线是否已被收藏&#xff09;2.1.2、add-favorite&#xff08;用于实现收藏功能&#xff09;2.1.3、remove-favorite&#xff08;用于实现取…

ubuntu20.04搭建kubernetes1.28.13集群配置calico网络插件

写在前面 这里是我在搭建过程中从某站找到的教学视频,搭载的都是最新的,大家可以参考一下 搭建kubernetes集群学习视频: 视频链接。最后面会有我遇见报错信息的所有连接和解决方案,自行查看 不说废话,直接开搭 搭建集群大纲 一、三台虚拟机的初始化 二、三台虚拟机连接…

内存管理篇-19 TLB和Table wake unit

TLB这几节&#xff0c;停下来感觉怪怪的。没有从TLB的引入&#xff0c;工作原理&#xff0c;实际源码应用来深入分析。 TLB 是一种高速缓存&#xff0c;用于存储最近使用的页表项&#xff08;Page Table Entries, PTEs&#xff09;。它的主要目的是加速虚拟地址到物理地址的转换…

卷积公式的几何学理解

1、Required Knowledge 1.1、概率密度函数 用于描述连续型随机变量在不同取值上的概率密度&#xff0c;记作 f ( x ) f(x) f(x)。 如随机变量 X X X的分布为正态分布&#xff0c;则其概率密度函数为&#xff1a; f ( x ) 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x)\frac{1}…

容器化你的应用:使用 Docker 入门指南

Docker 是一个流行的平台&#xff0c;它允许开发者将应用程序及其依赖项打包在一起&#xff0c;形成一个轻量级、可移植的容器。这种做法极大地简化了开发、测试和部署流程&#xff0c;因为无论是在本地还是在云端&#xff0c;容器都能确保应用的一致性。本指南将带你从头开始学…

粗心的懒洋洋做Python二级真题(错一大堆,分享错题)

以下内容&#xff0c;皆为原创&#xff0c;制作不易。感谢大家的点赞和关注。 一.数据流图 数据流图&#xff08;Data Flow Diagram&#xff0c;简称DFD&#xff09;是一种图形化表示法&#xff0c;用于展示信息系统中数据的流动和处理过程。 考点&#xff1a;数据流图是系统逻…

【我要成为配环境高手】Visual Studio中Qt安装与配置(无伤速通)

1.下载安装Qt和VSIX插件 2.本地环境变量配置 添加如下&#xff1a; D:\ProgramData\Qt\Qt5.14.2\5.14.2\msvc2017_64\libD:\ProgramData\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin3.VS配置 ⭐项目右键->属性->调试->环境&#xff0c;添加如下&#xff1a;(很重要&#x…

TCP的连接与断开

三次握手 主动发起连接建立的应用进程叫做客户端(client)。被动等待连接建立的应用进程叫做服务器(server)。 第一次握手&#xff1a;Client将同步比特SYN置为1&#xff08;表示这是一个连接请求或连接接受报文&#xff09;&#xff0c;并发送初始报文段序号seq x&#xff0…

kali——nikto的使用

目录 前言 使用方法 查看帮助&#xff08;--help&#xff09; 常规扫描&#xff08;-h&#xff09; 指定端口扫描&#xff08;-h -p&#xff09; 目录猜解&#xff08;-h -C&#xff09; 扫描敏感目录&#xff08;-h&#xff09; 保存扫描信息 前言 linux自带的nikto工…

【Motion Forecasting】SIMPL:简单且高效的自动驾驶运动预测Baseline

SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 这项工作发布于2024年&#xff0c;前一段时间我已经对这篇文章的摘要和结论进行了学习和总结&#xff0c;这一部分详见https://blog.csdn.net/Coffeemaker88/article/details/1…

快速构建一个ui界面程序--pyqt入门

快速构建一个ui界面程序--pyqt入门 0 背景1 环境准备1.1 安装python1.2 安装pyqt 2 UI设计2.1 启动UI设计可视化工具2.2 生成*.ui文件2.3 编译ui生成对应的py 3 使用UI 0 背景 本文档用于记录开发者如何快速构建一个简单UI程序。开发者使用文档中提及的工具并用于商业活动时&a…

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。 文章目录 一、新建项目二、导入数据三、处理四、自动注册五、坐标系转换六、模型导出七、立面模型导出八、创建项目点云九、导出一、新建项…

将二叉搜索树转化为排序的双向链表

题目描述 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表&#xff0c;你可以将左右孩子指针作为双向循环链表的前驱和后继指针&#xff0c;第一个节点的前驱是最后一个节点&#xff0c;最后一个节点的后继是第一个节点。 特别地&#xff0c;我…

shell了解和问答机制

GUI&#xff08;图形用户界面&#xff09; 定义与特点&#xff1a; GUI全称为Graphical User Interface&#xff0c;即图形用户界面。 它是一种采用图形方式显示的计算机操作用户界面&#xff0c;允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项&#xff0c;以选择命令…

海康二次开发学习笔记12-从Group外部输入图像

从Group外部输入图像 用OpenCV从本地读图 当Group内部无图像源模块时,可以通过代码的方式将图片传入Group内部.实现方式有多种,可以使用OpenCV从本地读图,可在程序集搜索引用OpenCvSharp&#xff0c;同时将其复制本地的属性改为False. 1. 界面设计 增加加载图像按钮 2. 处理…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

学习Kerberos

学习Kerberos Kerberos的 是一种分布式、基于票证的身份验证服务&#xff0c;因为基于分布式&#xff0c;可能这种类型的协议我们平时接触比较少&#xff0c;Web端一般都是通过Cookie、Token、Oauth、Password等各种协议认证&#xff0c;客户端通过Ssh、Password等认证方式&am…