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

42. 接雨水(相向双指针/前后缀分解),一篇文章讲透彻

        给定一个数组,代表柱子的高度

        求出下雨之后,能接的水有多少单位。我们将每一个柱子想象成一个水桶,看他能接多少水

        以这个水桶为例,他所能接的水取决于左边的柱子的最大高度和右边柱子的最大高度,因为只有柱子高的时候水才不会流出去,就比如红色的水桶他能接的水 = min(左边柱子最大高度,右边柱子最大高度) - 柱子的高度 = 1

        那么,求出了所有的水桶能接的水,求和就是我们的答案了,那么怎么能知道第i个柱子左右两侧柱子的最大值呢。这里我们需要借助两个数组,pre_max,suf_max,分别表示前缀最大值和后缀最大值,前置最大值等于 = max(pre_max[i-1],height[i]),suf_max同理。

        如下图:

        代码:

class Solution {
public://一个水桶能接的水取决于左边柱子的最大高度和右边柱子的最大高度,因为这样水才不会流出//前后缀分解//第i个宽度为1的桶可以接的水 = min(此处的前缀最大值,此处的后缀最大值) - height[i] int trap(vector<int>& height) {int n = height.size();int pre_max[n],suf_max[n];pre_max[0] = height[0];for (int i = 1;i < n;i++) {pre_max[i] = max(pre_max[i - 1],height[i]);}suf_max[n - 1] = height[n - 1];for (int i = n - 2;i >= 0;i--) {suf_max[i] = max(suf_max[i + 1],height[i]);}int ans = 0;for (int i = 0;i < n;i++) {ans += min(pre_max[i],suf_max[i]) - height[i];}return ans;}
};

时间复杂度:求pre_max和suf_max都是一次遍历,所以时间复杂度是O(n)的

空间复杂度:借助了两个数组,所以是O(n)的

        本题目时间复杂度已经最优了,那空间复杂度是否可以优化呢?注意到,如果我们求出了一个水桶的一部分前缀最大值和后缀最大值,此时前缀最大值小于后缀最大值,此时水桶的接水量就是前缀最大值-height[i],因为水是否会流出取决于较短的木板。这样我们用一个变量即可替代一个数组,将空间复杂度优化到了O(1)。

        具体代码:

class Solution {
public:int trap(vector<int>& height) {int n = height.size();int pre_max = 0,suf_max = 0;int left = 0, right = n - 1;int ans = 0;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++;}else{ans += suf_max - height[right];right--;}}return ans;}
};

http://www.xdnf.cn/news/3956.html

相关文章:

  • 从代码学习深度学习 - 目标检测前置知识(二) PyTorch版
  • uniapp 云开发全集 云开发的概念
  • 什么是原码、反码与补码?
  • 数据管理能力成熟度评估模型(DCMM)全面解析:标准深度剖析与实践创新
  • 【Java项目脚手架系列】第二篇:JavaWeb项目脚手架
  • js获取明天日期、Vue3大菠萝 Pinia的使用
  • 【Linux系统篇】:Linux线程互斥---如何用互斥锁守护多线程程序
  • MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
  • (undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)
  • Redis数据结构ZipList,QuickList,SkipList
  • 《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》封面颜色空间一图的选图历程
  • 电磁气动 V 型球阀:颗粒状矿浆与煤黑水介质处理的革命性解决方案-耀圣
  • GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)
  • 学习海康VisionMaster之亮度测量
  • 图像批量处理工具 界面直观易懂
  • TCP 与 UDP报文
  • Doo全自动手机壳定制系统
  • 【AI大模型学习路线】第一阶段之大模型开发基础——第四章(提示工程技术-1)Zero-shot与Few-shot。
  • 基于 jQuery 实现灵活可配置的输入框验证功能
  • 模型 - Xiaomi MiMo
  • Sui 上线两周年,掀起增长「海啸」
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)
  • MongoDB入门详解
  • 永磁同步电机控制算法--基于PI和前馈的位置伺服控制
  • C 语言 第五章 指针(7)
  • LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究
  • 从零开始学习RAG
  • Jetpack Compose 响应式布局实战:BoxWithConstraints 完全指南
  • 从0到1快速了解Redis数据库
  • 数字化转型:激活存量,引爆增量的三大核心逻辑