当前位置: 首页 > article >正文

LeetCode[42] 接雨水

动态规划

  1. left_max[i] = height[i]左侧的最高高度
  2. right_max[i] = height[i]右侧的最高高度
  3. height[i]能接多少水?min(left_max[i], right_max[i])-height[i]
class Solution {
public:int trap(vector<int>& height) {int len = height.size();vector<int> left_max(len,0);  // 左侧最高高度vector<int> right_max(len,0); // 右侧最高高度// 遍历获取左侧最高高度left_max[0] = height[0];for(int i=1;i<len;i++){left_max[i] = max(left_max[i-1],height[i]);}// 遍历获取右侧最高高度right_max[len-1] = height[len-1];for(int i=len-2;i>=0;i--){right_max[i] = max(right_max[i+1],height[i]);}// 获取接水量int res = 0;for(int i=0;i<len;i++){res += (min(left_max[i], right_max[i]) - height[i]);}return res;}
};
  1. 优化:左侧最高高度可以只使用一个int变量,遍历获取接水量时动态更新
class Solution {
public:int trap(vector<int>& height) {int len = height.size();int left_max = 0;vector<int> right_max(len,0);right_max[len-1] = height[len-1];for(int i=len-2;i>=0;i--){right_max[i] = max(right_max[i+1],height[i]);}int res = 0;for(int i=0;i<len;i++){left_max = max(left_max, height[i]);res += (min(left_max, right_max[i]) - height[i]);}return res;}
};

双指针

  1. 动态规划优化后依然需要维护左侧或者右侧的最高值,空间开销为O(n)
  2. 使用左右指针动态维护左侧和右侧最高值
class Solution {
public:int trap(vector<int>& height) {int res = 0;int left = 0;int right = height.size()-1;int left_max = 0;int right_max = 0;while(left<=right){// 当前位置接的水 =(先前最高值 - 当前位置的高度)// 当左指针的最高高度大于等于右指针最高高度,计算右指针的接水量// 当右指针的最高高度大于左指针最高高度,计算左指针的接水量// 原因:另一侧比当前一侧高,所以当前位置条件满足时肯定能接到水if(left_max<=right_max){left_max = max(left_max,height[left]);res = res + left_max - height[left++];}else{right_max = max(right_max,height[right]);res = res + right_max - height[right--];}}return res;}
};

  1. 从左到右遍历数组,遍历到下标 i 时
  2. 如果栈内至少有两个元素,记栈顶元素为 top
  3. top 的下面一个元素是 left,则一定有 height[left]≥height[top]
  4. 如果 height[i]>height[top],则得到一个可以接雨水的区域
    • 该区域的宽度是 i−left−1
    • 高度是 min(height[left],height[i])−height[top]
    • 根据宽度和高度即可计算得到该区域能接的雨水量
  5. 在对 top 计算能接的雨水量之后,left 变成新的 top,重复上述操作
  6. 直到栈变为空,或者栈顶下标对应的 height 中的元素大于或等于 height[i]
class Solution {
public:int trap(vector<int>& height) {stack<int> mystack;int res = 0;for(int i=0; i<height.size(); i++){while (!mystack.empty() && height[i] > height[mystack.top()]) {int top = mystack.top();mystack.pop();if(mystack.empty()) break; // 例如第一个高度是0,没有左侧边界,是接不到水的int left = mystack.top();int curr_width = i - left - 1;int curr_height = min(height[left], height[i]) - height[top];res += curr_height*curr_width;}mystack.push(i);}return res;}
};

相关文章:

LeetCode[42] 接雨水

动态规划 left_max[i] height[i]左侧的最高高度right_max[i] height[i]右侧的最高高度height[i]能接多少水&#xff1f;min(left_max[i], right_max[i])-height[i] class Solution { public:int trap(vector<int>& height) {int len height.size();vector<in…...

STC89C52单片机学习——第25节: [11-1]蜂鸣器

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.18 51单片机学习——第25节: [11-1]蜂鸣器 前言开发板说明引用解答和科普一、蜂鸣器…...

音视频入门基础:RTP专题(19)——FFmpeg源码中,获取RTP的音频信息的实现(下)

本文接着《音视频入门基础&#xff1a;RTP专题&#xff08;18&#xff09;——FFmpeg源码中&#xff0c;获取RTP的音频信息的实现&#xff08;上&#xff09;》&#xff0c;继续讲解FFmpeg获取SDP描述的RTP流的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四…...

搭建Python量化开发环境:从零开始的完整指南

搭建Python量化开发环境&#xff1a;从零开始的完整指南 在量化投资领域&#xff0c;一个稳定且高效的开发环境是成功的关键。本文将引导你一步步搭建起自己的Python量化开发环境&#xff0c;确保你能够顺利开始编写和运行量化策略。 &#x1f680;量化软件开通 &#x1f68…...

卷积神经网络 - 卷积的变种、数学性质

本文我们来学习卷积的变种和相关的数学性质&#xff0c;为后面学习卷积神经网络做准备&#xff0c;有些概念可能不好理解&#xff0c;可以先了解其概念&#xff0c;然后慢慢理解、逐步深入。 在卷积的标准定义基础上&#xff0c;还可以引入卷积核的滑动步长和零填充来增加卷积…...

BLIP论文阅读

目录 现存的视觉语言预训练存在两个不足&#xff1a; 任务领域 数据集领域 相关研究 知识蒸馏 Method 单模态编码器&#xff1a; 基于图像的文本编码器&#xff1a; 基于图像的文本解码器&#xff1a; 三重目标优化 图像文本对比损失&#xff1a;让匹配的图像文本更加…...

Opencv之计算机视觉一

一、环境准备 使用opencv库来实现简单的计算机视觉。 需要安装两个库&#xff1a;opencv-python和opencv-contrib-python&#xff0c;版本可以自行选择&#xff0c;注意不同版本的opencv中的某些函数名和用法可能不同 pip install opencv-python3.4.18.65 -i https://pypi.t…...

批量测试IP和域名联通性2

在前面批量测试IP和域名联通性-CSDN博客的基础上&#xff0c;由于IP和域名多样性&#xff0c;比如带端口号的192.168.1.17:17&#xff0c;实际上应该ping 192.168.1.17。如果封禁http://www.abc.com/a.exe&#xff0c;实际可ping www.abc.com。所以又完善了代码。 echo off se…...

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于&#xff1a;先以卷积层构成的模块充分抽取空间特征&#xff0c;再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款&#xff08;增加通道数&#xff09;和加深 这一节的NiN提出…...

C语言论递归函数及其本质

一个函数在函数体内又调用了本身&#xff0c;我们称为递归调用&#xff0c;这样的函数就是递归函数。 递归函数成功执行需满足以下两个条件&#xff1a; 必须有一个明显的结束条件。必须有一个趋近于结束条件的趋势。 举个生活例子&#xff1a;数钱 假设你有一叠钞票&#xf…...

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…...

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…...

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&#xff1a;0≤n≤105&#xff0c;0 ≤ai≤109&#xff0c;0 ≤k≤109 要求&am…...

Swift 并发中的任务让步(Yielding)和防抖(Debouncing)

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

@SpringBootApplication

SpringBootApplication拓展 一. SpringBootConfiguration注解 是SpringBoot的注解, 标识一个类为配置类, 与Configration功能一致 run方法初始化了SpringBootConfiguration注解 注解源码 Target(ElementType.TYPE)//类型 Retention(RetentionPolicy.RUNTIME)//生命周期 Docu…...

什么是状态管理?有何种方式可以实现?它们之间有什么区别?

目录 一、状态管理的核心概念 二、常见状态管理方案及对比 1. 基础方案:setState 2. 官方推荐:Provider 3. 事件驱动:Bloc (Business Logic Component) 4. 响应式增强:Riverpod 5. 轻量级全能库:GetX 三、方案对比与选型指南 四、实战建议 在 Flutter 中,状态管…...

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控&#xff08;流量&#xff09; 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 &#xff08;我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…...

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…...

设计模式(创建型)-单例模式

摘要 在软件开发的世界里&#xff0c;设计模式是开发者们智慧的结晶&#xff0c;它们为解决常见问题提供了经过验证的通用方案。单例模式作为一种基础且常用的设计模式&#xff0c;在许多场景中发挥着关键作用。本文将深入探讨单例模式的定义、实现方式、应用场景以及可…...

Leetcode 刷题笔记1 图论part01

图论的基础知识&#xff1a; 图的种类&#xff1a; 有向图&#xff08;边有方向&#xff09; 、 无向图&#xff08;边无方向&#xff09;、加权有向图&#xff08;边有方向和权值&#xff09; 度&#xff1a; 无向图中几条边连接该节点&#xff0c;该节点就有几度&#xff1…...

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…...

分享一个项目中遇到的一个算法题

需求背景&#xff1a; 需求是用户要创建一个任务计划在未来执行&#xff0c;要求在创建任务计划的时候判断选择的时间是否符合要求&#xff0c;否则不允许创建&#xff0c;创建的任务类型有两种&#xff0c;一种是单次&#xff0c;任务只执行一次&#xff1b;另一种是周期&…...

TI的Doppler-Azimuth架构(TI文档)

TI在AWR2944平台上推出新的算法架构&#xff0c;原先的处理方式是做完二维FFT后在RD图上做CFAR检测&#xff0c;然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后&#xff0c;再做角度维FFT&#xff0c;生成Doppler-Azimuth频谱图&#xff0c;然后在该频谱图…...

电子邮件常用协议技术详解与C++实践(SMTP POP3 IMAP)

一、核心协议概览 协议端口&#xff08;明文/加密&#xff09;核心功能数据同步方式典型场景SMTP25 / 587邮件发送单向传输客户端提交邮件POP3110 / 995邮件下载单向同步单设备离线阅读IMAP143 / 993邮件管理双向同步多设备实时同步 二、协议深度解析 1. SMTP&#xff08;简单…...

机器学习算法:一文掌握 K近邻算法 的详细用法(2个案例可直接运行)

文章目录 一、KNN 算法概述1.1 算法原理1.2 KNN 的优缺点1.3 K 值的选择 二、Python 实现 KNN 案例2.1 使用 KNN 算法进行手写数字识别2.2 使用 Python 实现 KNN 分类 三、总结 KNN&#xff08;K-Nearest Neighbors&#xff0c;K近邻算法&#xff09; 是一种简单且常用的分类和…...

设计C语言的单片机接口

一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式&#xff0c;输入为1&#xff0c;输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法&#xff1a; void pin_output(s…...

[从零开始学习JAVA] Stream流

前言&#xff1a; 本文我们将学习Stream流&#xff0c;他就像流水线一样&#xff0c;可以对我们要处理的对象进行逐步处理&#xff0c;最终达到我们想要的效果&#xff0c;是JAVA中的一大好帮手&#xff0c;值得我们了解和掌握。&#xff08;通常和lambda 匿名内部类 方法引用相…...

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…...

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…...

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11&#xff0c;已安装VS Cod…...