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

LeetCode 算法:接雨水c++

原题链接🔗:接雨水
难度:困难⭐️⭐️⭐️

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1
在这里插入图片描述
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2
输入:height = [4,2,0,3,2,5]
输出:9

提示

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

题解

双指针法

  1. 题解:

LeetCode 上的“接雨水”问题是一个典型的双指针问题,它要求我们计算在给定的条形图中,能够接住的雨水量。
这个问题可以通过以下步骤解决:

  • 理解问题:首先,我们需要理解雨水是如何被接住的。雨水只能被两个更高的条形所夹住。因此,问题转化为找到所有可能的“容器”,这些容器的两侧条形的高度差即为能够接住的雨水量。

  • 初始化:我们需要两个指针,分别指向数组的两端,即 left 和 right。同时,我们需要两个变量来记录从 left 到 right 遍历过程中遇到的左侧和右侧的最大高度,即 leftMax 和 rightMax。

  • 遍历数组:使用一个循环,当 left 小于 right 时,执行以下操作:

    • 如果 height[left] 小于 height[right],则移动 left 指针。此时,左侧条形的高度决定了雨水的量。如果
      height[left] 小于 leftMax,则更新 leftMax。
    • 如果 height[left] 大于或等于 leftMax,则当前位置可以接住雨水,其量为 leftMax - height[left]。
    • 同理,如果 height[left] 大于 height[right],则移动 right 指针,并更新 rightMax。如果 height[right] 小于
      rightMax,则当前位置可以接住雨水,其量为 rightMax - height[right]。
  • 更新结果:在每一步中,如果当前位置可以接住雨水,则将计算出的雨水量累加到总结果 ans 中。

  • 继续移动:更新完当前位置的雨水量后,根据 height[left] 和 height[right] 的比较结果,移动 left 或
    right 指针,继续寻找下一个可以接住雨水的位置。

  • 结束循环:当 left 和 right 相遇时,循环结束。

  • 返回结果:返回计算出的总雨水量 ans。

  1. 复杂度:时间复杂度O(N),空间复杂度O(1)。
  2. 代码过程
  • trap 函数接受一个整数数组 height 作为输入,返回能够接住的雨水量。

  • 函数首先检查数组是否为空,如果是,则返回0。

  • 使用两个指针 left 和 right 分别从数组的两端开始向中间移动。

  • 使用两个变量 leftMax 和 rightMax 来记录从左到右和从右到左遍历时遇到的最大高度。

  • 在每一步中,比较 height[left] 和 height[right]:

    • 如果 height[left] 小于 height[right],则移动 left 指针,并且如果 height[left] 小于 leftMax,则更新 leftMax。
    • 否则,计算当前位置能够接住的雨水量,并累加到 ans。
    • 类似地,如果 height[left] 大于或等于 height[right],则移动 right 指针,并且更新 rightMax。
  • 重复上述步骤直到 left 和 right 相遇。

  • main 函数提供了两个示例数组 height1 和 height2,调用 trap 函数,并打印出能够接住的雨水量。

  1. c++ demo
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 函数用于计算接雨水的量
int trap(vector<int>& height) {int n = height.size();if (n == 0) return 0;// 初始化左右边界的最大高度int leftMax = 0, rightMax = 0;int left = 0, right = n - 1;int ans = 0;// 双指针从两端向中间移动while (left < right) {if (height[left] < height[right]) {// 如果左侧的条形高度小于右侧if (height[left] >= leftMax) {// 更新左侧的最大高度leftMax = height[left];}else {// 计算雨水量ans += leftMax - height[left];}left++;}else {// 右侧的条形高度不小于左侧if (height[right] >= rightMax) {// 更新右侧的最大高度rightMax = height[right];}else {// 计算雨水量ans += rightMax - height[right];}right--;}}return ans;
}int main() {// 示例输入vector<int> height1 = { 0,1,0,2,1,0,1,3,2,1,2,1 };vector<int> height2 = { 4,2,0,3,2,5 };// 调用 trap 函数并打印结果cout << "Rainwater trapped by height1: " << trap(height1) << endl;cout << "Rainwater trapped by height2: " << trap(height2) << endl;return 0;
}
  • 输出结果:

Rainwater trapped by height1: 6
Rainwater trapped by height2: 9
在这里插入图片描述

相关文章:

  • 【刷题(16)】子串
  • 提莫攻击 ---- 模拟算法
  • 备战十一届大唐杯国赛预选赛
  • C# as运算符
  • Visual Studio Code使用(C++项目新建,运行)
  • 快速入门文件操作+5种例子演示
  • 前端项目如何排查是否使用第三方.ttf
  • Docker中布置Jenkins实现Android项目的自动化构建
  • Django 创建项目及应用
  • elementui中的表单,根据条件判断切换是否必填
  • [Windows] 植物大战僵尸杂交版
  • 【NOI】C++程序结构入门之循环结构二-for循环
  • 非计算机行业的人,如何使用大模型进行自媒体创作
  • 【MySQL】库和表的操作
  • 【C++奇技淫巧】CRTP(奇特重现模板模式)
  • php的引用
  • 分享一款快速APP功能测试工具
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Angular 响应式表单 基础例子
  • css布局,左右固定中间自适应实现
  • eclipse(luna)创建web工程
  • isset在php5.6-和php7.0+的一些差异
  • Iterator 和 for...of 循环
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • java小心机(3)| 浅析finalize()
  • linux安装openssl、swoole等扩展的具体步骤
  • PHP 7 修改了什么呢 -- 2
  • Puppeteer:浏览器控制器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SOFAMosn配置模型
  • Vue UI框架库开发介绍
  • 关于Flux,Vuex,Redux的思考
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 嵌入式文件系统
  • 如何进阶一名有竞争力的程序员?
  • 使用 @font-face
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 硬币翻转问题,区间操作
  • 主流的CSS水平和垂直居中技术大全
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • "无招胜有招"nbsp;史上最全的互…
  • # Kafka_深入探秘者(2):kafka 生产者
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)无线电失控保护(二)
  • (ibm)Java 语言的 XPath API
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (计算机网络)物理层
  • (理论篇)httpmoudle和httphandler一览
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)appium-desktop定位元素原理