1. 积水面积问题概述
积水面积问题是一个经典的算法题目,主要考察对数据结构的理解和应用能力。题目描述了一组由正方体叠起的柱子,要求计算这些柱子之间能够积水的总面积。这个问题在实际生活中有很多应用场景,比如城市排水系统设计、地形蓄水计算等。
1.1 问题形象化理解
想象一排高低不齐的柱子排列在一起,下雨时雨水会积聚在柱子之间的凹陷处。积水的形成需要满足一个基本条件:两侧都必须有比当前位置更高的柱子,这样才能形成"容器"来盛装雨水。
举个例子,给定柱子高度序列:[0,1,0,2,1,2,0,0,2,0],我们可以这样理解:
- 第一个0和最后一个0是边界,它们不会积水
- 第一个1左右分别是0和2,可以积水1-0=1个单位
- 中间的0左右分别是1和2,可以积水1-0=1个单位
- 以此类推,最终总积水面积为6个单位
1.2 问题数学化表达
从数学角度看,对于每个位置i,它能积存的水量由以下因素决定:
- 它左侧所有柱子中的最大高度left_max
- 它右侧所有柱子中的最大高度right_max
- 当前位置的柱子高度height[i]
积水量计算公式为:
water[i] = min(left_max, right_max) - height[i]
如果结果为正,则计入总量;否则不计入。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法一:左右最大高度法
2.1 算法思路解析
左右最大高度法是最直观的解决方案,其核心思想是:
- 预先计算每个位置左侧的最大高度
- 预先计算每个位置右侧的最大高度
- 遍历每个位置,用左右最大高度的较小值减去当前高度,得到积水量
这种方法的时间复杂度是O(n),因为需要三次遍历:一次计算左最大,一次计算右最大,一次计算结果。空间复杂度也是O(n),需要存储左右最大高度数组。
2.2 代码实现详解
cpp复制#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> height(n);
for (int i = 0; i < n; ++i) {
cin >
