【LeetCode 42】接雨水(单调栈、DP、双指针)

题面:

在这里插入图片描述

思路:

能接雨水的点,必然是比两边都低(小)的点。有两种思路,一种是直接计算每个点的最大贡献(也就是每个点在纵向上最多能接多少水),另一种就是计算每个点在横向上有没有贡献。
第一种思路,就需要我们能拿到每个点左右两边最高的高度,这样就能计算每个点在纵向上能接多少水,相当于木桶效应。
第二种思路,对于每个点,则需要判断它左右两边是不是都有比它高的点,每次计算横向上局部能接到水的区域。
官方题解挺好的,具体不再赘述

1. 单调栈

就是第二种思路,每次更新横向上能接到的水。

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();stack<int> stk;for(int i = 0; i < n; ++ i) {while(!stk.empty() && height[i] > height[stk.top()]) {// 得到当前低点int buttom = stk.top(); stk.pop();if(!stk.empty()) {int j = stk.top();// 如果 height[j] == height[bottom]// 就说明 bottom 的左边还没有出现凸出来让bottom能接到水的边边ans += (i - j - 1) * (min(height[i], height[j]) - height[buttom]);}}stk.push(i);}return ans;
}

2. 动态规划

第一种思路,要拿到每个点左右两边的最大高度,就可以考虑线性DP的思想去记录当前点左右两边的最大高度。
l e f t M a x [ i ] = m a x ( l e f t M a x [ i − 1 ] , h e i g h t [ i ] ) r i g h t M a x [ i ] = m a x ( r i g h t M a x [ i + 1 ] , h e i g h t [ i ] ) g o t W a t e r [ i ] = m i n ( l e f t M a x [ i ] , r i g h t M a x [ i ] ) − h e i g h t [ i ] leftMax[i]=max(leftMax[i-1],height[i])\\ rightMax[i]=max(rightMax[i+1],height[i])\\ gotWater[i] = min(leftMax[i],\ rightMax[i])-height[i] leftMax[i]=max(leftMax[i1],height[i])rightMax[i]=max(rightMax[i+1],height[i])gotWater[i]=min(leftMax[i], rightMax[i])height[i]

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();vector<int> leftMax(n), rightMax(n);leftMax[0] = height[0]; rightMax[n - 1] = height[n - 1];for(int i = 1; i < n; ++ i) leftMax[i] = max(leftMax[i - 1], height[i]);for(int i = n - 2; i >= 0; -- i) rightMax[i] = max(rightMax[i + 1], height[i]);for(int i = 1; i < n - 1; ++ i)ans += min(leftMax[i], rightMax[i]) - height[i];return ans;
}

双指针

使用双指针和临时变量优化掉 l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 两个数组。
官方题解说:如果 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left]<height[right] height[left]<height[right],则必有 l e f t M a x < r i g h t M a x leftMax<rightMax leftMax<rightMax
这主要是因为,我们每次移动的都是 h e i g h t height height 较小的指针,因此如果 l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 有更新,则更新了的点 l e f t left left r i g h t right right l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 得到新的更新之前会停留一阵子。因此如果 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left]<height[right] height[left]<height[right],则必有 l e f t M a x < r i g h t M a x leftMax<rightMax leftMax<rightMax

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();int left = 0, right = n - 1;int leftMax = height[0], rightMax = height[n - 1];while(left < right) {leftMax = max(leftMax, height[left]);rightMax = max(rightMax, height[right]);if(height[left] < height[right])ans += min(leftMax, rightMax) - height[left ++];elseans += min(leftMax, rightMax) - height[right --];}return ans;
}

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

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

相关文章

【嵌入式开发-USB】

嵌入式开发-USB ■ USB简介 ■ USB简介

Visual Studio 项目转Qt项目

1. 先确保qmake 和 minGW &#xff08;g&#xff09; 路径都在系统变量内&#xff1b;或者通过WinR -> cmd 来检测&#xff0c; 如果能够 显示qmake 的信息 &#xff0c; g 的信息 &#xff0c; 就说明设置环境变量成功。 2. 打开项目文件夹&#xff0c;在这里打开cmd, 换…

总线通信篇:I2C、SPI、CAN 的底层结构与多机通信设计

本文为嵌入式通信协议系列第三章,深入剖析 MCU 世界中的三大总线协议 —— I2C、SPI 和 CAN。 这些总线协议广泛应用于传感器数据采集、Flash 存储、外设扩展、汽车电子、工业设备控制等领域,是嵌入式开发不可或缺的通信骨架。 📜 一、总线通信的基本概念 1.1 什么是总线?…

sherpa:介绍

更多内容&#xff1a;XiaoJ的知识星球 目录 1. sherpa 介绍 1. sherpa 介绍 sherpa是 Next-gen Kaldi 项目的部署框架。 sherpa 支持在各种平台上部署与语音相关的预训练模型&#xff0c;并提供多种语言绑定。 目前&#xff0c;sherpa 拥有以下子项目&#xff1a; k2-fsa/sh…

77.组合问题

主函数 combine def combine(self, n: int, k: int) -> List[List[int]]:result [] # 存放所有有效的组合self.backtracking(n, k, 1, [], result) # 从数字1开始搜索return result 作用&#xff1a;初始化并启动回溯过程。参数&#xff1a; n4&#xff1a;数字范围是1…

Oracle免费认证来袭

1、Oracle Cloud Infrastructure 2025 Foundations Associate” &#x1f517; 考证地址&#xff1a;https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…

【Unet++】

这是一篇关于语义分割U-net及其变体网络结构的介绍性文章&#xff0c;主要介绍了U-net、U-net以及U-net的基本结构、特点和应用。 以下是对这些核心内容的简要概述&#xff1a; 1. 语义分割U-net概述: - 基本结构&#xff1a;U-net是一种编码解码结构的网络&#xff0c;起初…

git可视化工具Fork软件的详细使用教程

Fork是一款流行的Git图形化客户端&#xff0c;适用于Windows和macOS平台。使用起来确实很方便&#xff0c;唯一的缺陷就是正版需要付费使用&#xff01; Fork 安装 官网下载地址&#xff1a;Fork官网地址https://git-fork.com/ 支持 macOS 和 Windows。 安装完成后&#xff…

【JMeter技巧】GET请求如何传递Body参数?版本兼容性详解场景需求

在实际接口测试中&#xff0c;有时会遇到特殊需求&#xff1a;需要给GET请求传递Body参数。但JMeter默认配置下&#xff0c;GET请求的Body数据会被自动忽略。本文将介绍如何通过配置解决这个问题。 配置步骤 1. 版本要求&#xff08;重要&#xff01;&#xff09; JMeter ≥ …

HTML5好看的水果蔬菜在线商城网站源码系列模板9

文章目录 1.设计来源1.1 主界面1.2 商品界面1.3 购物车界面1.4 心愿列表界面1.5 商品信息界面1.6 博客界面1.7 关于我们界面1.8 联系我们界面1.9 常见问题界面1.10 登录界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&…

es 里的Filesystem Cache 理解

文章目录 背景问题1&#xff0c;Filesystem Cache 里放的是啥问题2&#xff0c;哪些查询它们会受益于文件系统缓存问题3 查询分析 背景 对于es 优化来说常常看到会有一条结论给&#xff0c;给 JVM Heap 最多不超过物理内存的 50%&#xff0c;且不要超过 31GB&#xff08;避免压…

存储器:DDR和独立显卡的GDDR有什么区别?

本文来简要对比DDR&#xff08;Double Data Rate SDRAM&#xff09;和GDDR&#xff08;Graphics Double Data Rate SDRAM&#xff09;的区别&#xff0c;重点说明它们在设计、性能和应用上的差异&#xff1a; 1. 设计目标与架构 DDR&#xff1a;通用型DRAM&#xff0c;设计为…

【Electron】electron-vue 借助 element-ui UI 库助力桌面应用开发

前面文章我们讲过 electron 让可以用 HTML、JS、CSS 开发桌面应用程序。而 electron-vue 是一个结合了 electron 与 vue 的套件。这样我们就能方便地使用 vue 快速开发桌面应用。但是&#xff0c;vue 只是在 js 这层面做了大量的便捷的操作。对 UI 并未过多涉及。此时如果您在开…

Linux/AndroidOS中进程间的通信线程间的同步 - 消息队列

本文介绍消息队列&#xff0c;它允许进程之间以消息的形式交换数据。数据的交换单位是整个消息。 POSIX 消息队列是引用计数的。只有当所有当前使用队列的进程都关闭了队列之后才会对队列进行标记以便删除。POSIX 消息有一个关联的优先级&#xff0c;并且消息之间是严格按照优…

深入理解进程与线程、进程池与线程池:企业级开发实战指南

简介 并发编程是现代软件开发的核心能力,而进程与线程、进程池与线程池是实现高效并发的关键技术。 本文将从基础概念出发,深入解析它们的工作原理、优势及适用场景,并提供Python、Java、C#等主流语言的实战代码,帮助开发者掌握企业级并发编程的最佳实践。 一、进程与线程…

解锁 LLM 推理速度:深入 FlashAttention 与 PagedAttention 的原理与实践

写在前面 大型语言模型 (LLM) 已经渗透到我们数字生活的方方面面,从智能问答、内容创作到代码辅助,其能力令人惊叹。然而,驱动这些强大模型的背后,是对计算资源(尤其是 GPU)的巨大需求。在模型推理 (Inference) 阶段,即模型实际对外提供服务的阶段,速度 (Latency) 和吞…

Go使用Gin写一个对MySQL的增删改查服务

首先用SQL创建一个包含id、name属性的users表 create table users (id int auto_incrementprimary key,name varchar(255) null );查询所有用户信息&#xff1a; func queryData(db *sql.DB, w http.ResponseWriter) {rows, err : db.Query("SELECT * FROM users"…

键盘弹起导致页面上移

问题&#xff1a;聊天页面&#xff0c;如果输入框设置了adjust-position属性为true&#xff0c;会导致键盘弹起时&#xff0c;整个页面上移&#xff0c;顶部导航栏也会跟着上移。 我想要的效果&#xff1a;键盘弹起时&#xff0c;页面内容上移&#xff0c;顶部导航栏保持不动 …

机器视觉的手机FPC油墨丝印应用

在现代智能手机制造过程中&#xff0c;精密的组件装配和质量控制是确保产品性能和用户体验的关键。其中&#xff0c;柔性印刷电路板&#xff08;FPC&#xff09;的油墨丝印工艺尤为关键&#xff0c;它不仅影响到电路板的美观&#xff0c;更直接关系到电路的导电性能和可靠性。而…

ChromeDriverManager的具体用法

ChromeDriverManager 是 webdriver_manager 库的一部分&#xff0c;它用于自动管理 ChromeDriver 的下载和更新。使用 ChromeDriverManager 可以避免手动下载 ChromeDriver 并匹配系统中安装的 Chrome 浏览器版本。以下是 ChromeDriverManager 的基本用法&#xff1a; 步骤 1…