给 n 个非负整数表示每个宽度为一的柱子的高度图,计算下雨之后能接多少水。
例如,
输入 [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 个单位的雨水(蓝色部分)。 感谢 Marcos 贡献此图。
木桶原理,盛的水取决于最短板。。。我们设置两个指针从左右两端开始向中间靠拢。。。我们根据短的那一端向高的那一端靠拢。
然后过程中更新左右最高的柱子,来求的中间的蓄水量。。。过程看代码
int trap(vector& height) {
if (height.size() < 3)
return 0;
int res = 0;
int ml = height.front();// heightest left
int mr = height.back();// .... .... right
int nl = 1;// the position of left
int nr = height.size() - 2;//....... right
while (nl <= nr) {
if (ml < mr) {
if (ml < height[nl]) {
ml = height[nl];
} else {
res += ml - height[nl];
}
nl++;
} else {
if (mr < height[nr]) {
mr = height[nr];
} else {
res += mr - height[nr];
}
nr--;
}
}
return res;
}