給定非負整數數組 `height` 表示柱狀圖高度,寬度為 1。計算下雨後能接多少雨水。
例:`[0,1,0,2,1,0,1,3,2,1,2,1]` → 6
位置 `i` 能接的水高 = `min(左側最高, 右側最高) - height[i]`(若為正)。
int trap(vector& h) {
int n = h.size(); if (!n) return 0;
vector lmax(n), rmax(n);
lmax[0] = h[0];
for (int i=1; i=0; i--) rmax[i] = max(rmax[i+1], h[i]);
int ans = 0;
for (int i=0; i
維護 `left, right` 指針及 `lmax, rmax`:
int trap(vector& h) {
int l=0, r=h.size()-1, lmax=0, rmax=0, ans=0;
while (l <= r) {
if (h[l] <= h[r]) {
if (h[l] >= lmax) lmax = h[l];
else ans += lmax - h[l];
l++;
} else {
if (h[r] >= rmax) rmax = h[r];
else ans += rmax - h[r];
r--;
}
}
return ans;
}
此題是「前後綴分解」與「雙指針優化」的教科書級案例,掌握其從 O(N) 空間到 O(1) 空間的推導過程,可觸類旁通解決眾多區間極值問題。