https://www.acwing.com/problem/content/1576/
给定 n n n个非负整数表示每个宽度为 1 1 1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。例如,当给定数字序列为 0 , 1 , 0 , 2 , 1 , 0 , 1 , 3 , 2 , 1 , 2 , 1 0,1,0,2,1,0,1,3,2,1,2,1 0,1,0,2,1,0,1,3,2,1,2,1时,柱子高度图如下所示,最多可以接 6 6 6个单位的雨水。
输入格式:
第一行包含整数 n n n。
第二行包含 n n n个非负整数。
输出格式:
输出一个整数,表示最大接水量。
数据范围:
1 ≤ n ≤ 1 0 5 1≤n≤10^5 1≤n≤105
序列中元素均不大于 1000 1000 1000
可以用双指针,思路见https://blog.csdn.net/qq_46105170/article/details/108571279。代码如下:
#include
using namespace std;
const int N = 1e5 + 10;
int n, a[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
int l = 1, r = n, ml = a[1], mr = a[n];
int res = 0;
while (l < r) {
if (a[l] <= a[r]) {
res += max(0, min(ml, mr) - a[++l]);
ml = max(ml, a[l]);
} else {
res += max(0, min(ml, mr) - a[--r]);
mr = max(mr, a[r]);
}
}
printf("%d\n", res);
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。