leetcode42:接雨水

给定 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:定义题目问题性质

计算问题性质

给定一组表示柱子高度的数组 height,每个元素代表柱子的位置和高度。我们的目标是计算雨水在这些柱子之间能够储存的总量。这是典型的"接雨水"问题。

输入输出条件
  • 输入:一个非负整数数组 height,长度为 n,每个元素代表宽度为 1 的柱子高度。
  • 输出:一个整数,表示可以存储的雨水总量。
限制条件
  • n == height.length,数组的长度为 n
  • 1 <= n <= 2 * 10^4,柱子的数量最多为 20000。
  • 0 <= height[i] <= 10^5,每个柱子的高度最大为 100000。
边界条件
  • 如果 n == 1,显然无法存储任何雨水,结果为 0
  • 如果所有柱子的高度都为 0,同样也不能存储雨水。
  • 只有两个柱子的情况下,也不会存储雨水。

步骤2:解题思路分解

这类问题可以从以下几种方法着手:

1. 暴力解法

对每个柱子来说,计算它左右两侧的最大高度,然后根据该柱子的高度,计算其上方可以存储的雨水量。这个解法时间复杂度为 O(n^2),不够高效,尤其在输入规模较大时。

2. 动态规划

为了避免暴力解法的重复计算,可以提前计算出每个柱子左右两侧的最大高度,使用两个数组 left_maxright_max 分别记录到每个柱子为止,左侧和右侧的最大高度。这样就可以在 O(n) 时间内计算每个柱子的存储水量。

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)(由于使用了两个额外数组)
3. 双指针法(最佳方案)

双指针法通过维护两个指针,一个从左向右,一个从右向左,逐步计算每个位置的存水量。通过比较左右两侧的最大高度,更新指针和存水量。这种方法可以在 O(n) 时间内完成计算,且只需要常数级的额外空间。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(只使用了几个额外的变量)
解决方案总结

最优方法是双指针法,因为它在时间和空间上都达到了最优。

步骤3:C++代码实现

代码解析:
  1. 使用 leftright 两个指针从数组两端向中间移动。
  2. left_maxright_max 分别存储左边和右边遇到的最大高度。
  3. 每次根据 height[left]height[right] 的大小决定移动哪个指针,并计算对应位置的存水量。
  4. leftright 相遇时,结束计算。

步骤4:启发与优化

通过这道题可以得到的启发是:

  • 双指针法的使用可以极大地提高算法的效率,尤其是在处理类似的对称性问题时,它避免了不必要的计算。
  • 空间优化:我们通过双指针法减少了空间复杂度,使得算法可以在不额外存储中间结果的情况下高效完成任务。这种思路对于处理大规模数据集非常有用。

步骤5:实际应用场景分析

这种"接雨水"的问题在实际生活中的应用场景很多,特别是在地理信息系统建筑水力学中。例如:

  • 城市排水系统设计:在设计城市下水道时,工程师需要考虑不同区域的地形(可以类似于柱子的高度),并通过算法计算暴雨期间可能产生的积水量,进而设计合理的排水系统。该算法可以帮助模拟大规模区域的降雨积水情况,从而优化排水设施的建设。

  • 灌溉系统的优化:在农业领域,尤其是对于不平坦的田地,计算田地之间可以储存的水量对于合理分配水资源非常重要。利用类似算法可以优化灌溉系统设计,提升农业水资源的利用效率。

这种算法可以通过对高程数据进行分析,预测可能的积水量和流向,进而为不同地区设计最佳的排水解决方案。

相关推荐
冷琴19966 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
缘友一世14 分钟前
macOS .bash_profile配置文件优化记录
开发语言·macos·bash
tekin17 分钟前
macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
开发语言·macos·php·port·mac多版本php安装管理·port-select
s_little_monster26 分钟前
【QT】QT入门
数据库·c++·经验分享·笔记·qt·学习·mfc
CSXB9926 分钟前
一、Python(介绍、环境搭建)
开发语言·python·测试工具·集成测试
Mopes__30 分钟前
Python | Leetcode Python题解之第461题汉明距离
python·leetcode·题解
Yingye Zhu(HPXXZYY)33 分钟前
洛谷 P11045 [蓝桥杯 2024 省 Java B] 最优分组
c++·蓝桥杯
火红的小辣椒36 分钟前
PHP反序列化7(字符串逃逸)
开发语言·web安全·php
三玖诶43 分钟前
第一弹:C++ 的基本知识概述
开发语言·c++
睡不着还睡不醒44 分钟前
【数据结构强化】应用题打卡
算法