用a[i]表示第i個牆的高度,牆的個數記為n
思考:1)兩個牆x,y之間可以盛水的條件是a[x],a[y]是a[x...y]中的前兩大數;
2)如果a[1...x-1]中存在a[i]>a[x],那麼用k來替代x並不會使a[x...y]中盛水減少,同樣如果a[y+1...n]中存在a[j]>a[y],可以用j替代y不會使a[x...y]中的盛水減少;
3) 如果得到了a[1...n]中的前兩大i,j,那麼它們一定是整個區間盛水的最優邊界,a[i...j]中的水位就是min,只需要考慮兩邊:a[1...i]和a[j...n];對於左邊,如果a[1...i-1]中最大值為a[k],那麼進一步a[k...i]區間的盛水情況也確定了,只需要考慮a[1...k]了,右邊也是如此。
4)設a[t]是a[1...n]中最大值,那麼a[1...t]中的盛水情況可以通過維護左連續區間最大值確定,同樣右區間a[t...n]也可以確定:首先找到最大值,然後分別從左右兩邊遍歷。
5)一次遍歷的做法很巧妙:維護兩端區間的最大值,這樣可以確定一端的水位了。
int cal(void)else
}return
ret;
}
求解twitter面試題(牆壁裝水問題)
看見twitter上一道面試題,題目是這樣的,試著做了一下 在這個裡我們有不同高度的牆。這個由乙個整數陣列所代表,陣列中每個數是牆的高度。上邊的圖可以表示為陣列 2,5,1,2,3,4,7,7,6 假如開始下雨了,那麼牆之間的水坑能夠裝多少水呢?思路分析 1.找出該陣列最大的元素 row 2.將該陣...
經典面試題 盛最多水的容器(雙指標法)
例題 給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6,2...
面試題 可以盛放多少水呢?
題目 從這個圖例來看,當我們從左往右掃瞄的時候,可以發現 a,第1,2,3塊牆能形成乙個u型槽,這個槽能蓄水1個單位 b,第1,2,3,4 能蓄水3個單位,包括上一步驟 a 的水,實際上由於牆4的加入在 a 的基礎上增加了2個單位的蓄水,同時可以看出牆4個加入實際上是 和牆1在高度為2的基礎上形成了...