题意
给一些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;
}
};