題目:
從這個圖例來看,當我們從左往右掃瞄的時候,可以發現:
a, 第1,2,3塊牆能形成乙個u型槽,這個槽能蓄水1個單位
b, 第1,2,3,4 能蓄水3個單位,包括上一步驟(a)的水,實際上由於牆4的加入在(a)的基礎上增加了2個單位的蓄水,同時可以看出牆4個加入實際上是
和牆1在高度為2的基礎上形成了乙個寬度為2高度為1的u型槽,以此類推後面各個牆,我們可以依次計算出可以蓄水的總量。
基於這個思路,可以用乙個棧來維護乙個高度為遞減的牆:
1, 當前棧為空,那麼直接將改牆壓入棧,同時需要記錄這個入棧元素的下標(方便後面計算u型槽的寬度)
2, 棧不為空:
a, 當前牆比棧頂的牆高度低,那麼直接入棧,同樣需要記錄入棧元素的下標。
b,當前牆和棧頂的牆高度相同,那麼直接扔掉當前牆(這個牆的高度可以用棧頂的替代)
c, 當前牆比棧頂牆高度高,這時候就形成了乙個u型槽,那麼需要計算這個u型槽所能蓄的水量
u型槽寬度 = 兩高牆的下標差 - 1
u型槽高度 = 兩側高牆的高度較小者 - u型槽底部牆的高度
兩者乘積便是蓄水量
反覆這個過程,直到當前牆的高度小於棧頂或者棧頂為空,然後入棧,記錄下標。
由於整個演算法過程,每個元素最多進行乙個入棧和出棧操作,所以時間複雜度為o(n)進行一遍掃瞄就行了, 這個過程只需要維護乙個最多儲存所有元素的棧所以空間複雜度也是o(n)
#include#include#includeint min(const int a, const int b)
int main( int argc, char **argv)
int top = 0;
int stack[1024];
int index[1024];
int area = 0;
idx = 0;
while ( idx < n )
//棧裡只有乙個元素,那麼必然無法形成u型槽,所以直接彈出站
if ( top == 1 && array[idx] > stack[top - 1])
index[top] = idx;
stack[top++] = array[idx++];
}printf("area = %d\n", area);
return 0;
}
面試題 盛水 twitter
用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....
求解twitter面試題(牆壁裝水問題)
看見twitter上一道面試題,題目是這樣的,試著做了一下 在這個裡我們有不同高度的牆。這個由乙個整數陣列所代表,陣列中每個數是牆的高度。上邊的圖可以表示為陣列 2,5,1,2,3,4,7,7,6 假如開始下雨了,那麼牆之間的水坑能夠裝多少水呢?思路分析 1.找出該陣列最大的元素 row 2.將該陣...
華為面試題 最高分是多少
老師想知道從某某同學當中,分數最高的是多少,現在請你程式設計模擬老師的詢問。當然,老師有時候需要更新某位同學的成績.輸入描述 輸入包括多組測試資料。每組輸入第一行是兩個正整數n和m 0 n 30000,0 m 5000 分別代表學生的數目和操作的數目。學生id編號從1編到n。第二行包含n個整數,代表...