問題:
有一塊矩形土地被劃分成 n×m 個正方形小塊,每塊是一平方公尺。這些小塊高低不平,每一小塊地都有自己的高度h(i, j)公尺。水可以由任意一塊地流向周圍四個方向的四塊地中,但不能直接流入對角相連的小塊中。一場大雨後,許多低窪地方都積存了不少降水,求出它最多能積存多少立方公尺的降水麼?
思路:先看一維的情況如何處理:
預處理: 對每個格仔求左邊和右邊的最高高度。 遍歷每個格仔: 找到左右最高高度的較小值,看是否大於這個格仔的高度,如果大於則高度差就是這個格仔存的水量。n個格仔的積水量相加就是結果。
**如下:**自:
)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;//有一塊矩形土地被劃分成 n×m 個正方形小塊,每塊是一平方公尺。這些小塊高低不平,
//每一小塊地都有自己的高度h(i, j)公尺。水可以由任意一塊地流向周圍四個方向的四塊地中,
//但不能直接流入對角相連的小塊中。一場大雨後,許多低窪地方都積存了不少降水,求出它最多能積存多少立方公尺的降水麼?
int trap(int* a, int n)
int maxr = 0;
for ( int i = n-1; i >= 0; i-- )
int res = 0;
for ( int i = 0 ; i < n-1 ;i++)
delete left;
delete right;
return res;
}
一維的相對簡單,那麼二維的如何處理呢?
下面是中的討論的一些思路:
一種思路是找出四周最低的一塊,從那開始灌水。先把四周的高度加入優先佇列(priority queue, 或heap),取出最低的向四周擴充套件,低於就注水,高於就加入堆。
Google 的面試題
一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出電腦的記憶體堆疊是向上溢位還是向下溢位?你要向你8歲的侄子解釋什麼是資料...
Google面試題(六)
題目 對現在的stack 棧 資料結構進行改進,加乙個min 功能,使之能在常數,即o 1 時間內給出棧中的最小值。可對push 和pop 函式進行修改,但要求其時間複雜度都只能是o 1 分析 要使pop,push,min都是o 1 所以肯定要犧牲點空間 思路 1 在stack的資料結構中加兩個個字...
google雜湊面試題
題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。用雜湊表解題 分析 這道題是2006年google的一道筆試題。解 由於字元 char 是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的...