题意
给一些bar,求这些bar能够积水的面积。
思路
扫描。
先考虑对于一个bar,能够积水的区域:
即向左有一个bar: l,向右有一个bar:
那么,对于该题,我们只需要将每个bar能够积水的区域累加起来即可。
用li维护i向左的最大bar,ri维护i向右最大bar,扫描一遍得到l[]和r[],然后,我们的结果为:
ans=∑i=0n−1max(0,li−1+ri+1−hi)
代码
class Solution {
public:
int trap(vector<int>& h) {
int n = h.size(), ans = 0;
vector<int> l(n, 0);
vector<int> r(n, 0);
for (int i = 0; i < n; i++) l[i] = i ? max(l[i - 1], h[i]) : h[i];
for (int i = n - 1; i >= 0; i--) r[i] = i != n - 1 ? max(r[i + 1], h[i]) : h[i];
for (int i = 1; i < n - 1; i++) {
int t = min(l[i - 1], r[i + 1]) - h[i];
ans += t > 0 ? t : 0;
}
return ans;
}
};

本文介绍了一种计算由不同高度柱状物组成的地形上能积累多少水量的算法。通过一次遍历并记录左右两侧最高柱状物的方法,实现了高效计算积水面积的目的。
&spm=1001.2101.3001.5002&articleId=58033442&d=1&t=3&u=1908a5647af245638534d101b17be7e7)
851

被折叠的 条评论
为什么被折叠?



