拷貝連結串列;及糖果分析

紫鳳發表於2013-10-21

今日面試題:拷貝連結串列

有一個連結串列,每一個節點除了next指標指向一下節點以外,又多出了一個指標random,指向連結串列中的任何一個節點,包括null。請給出方法完成連結串列的深拷貝。

===============================================

糖果分析

原題

N個孩子站成一排,每個人分給一個權重。按照如下的規則分配糖果:

1. 每個孩子至少有一個糖果

2. 所分配權重較高的孩子,會比他的鄰居獲得更多的糖果

問題是,最少需要多少個糖果?

分析

這個題目是要求找到最少需要多少個糖果。最少的糖果是存在的,體現在哪裡呢?權重較高的孩子,會比他的鄰居們獲得更多的糖果,那麼多多少呢?可以是 1個,2個,或者更多個,但顯然,當多一個的時候。總的糖果的數量是最少的,除此之外呢?當某一個孩子的鄰居的權重都比他大,那他應該獲得多少個糖果呢? 只有一個——每個孩子至少要得到一個。

所以根據上面的分析,我們可以想辦法找到權重陣列A中的波谷(也就是權重小於鄰居們的孩子),很顯然這些孩子每人只可以分得一個糖果。我們開闢一個 新的陣列B,表示每個孩子可以得到的最少的糖果數。掃描一遍A,得到所有的波谷的孩子,然後將對應的B的值設定為1.對於第一個和最後一個權重,只要 A[0]

然後該如何確定其他孩子的糖果數呢?我們看一個具體的例子,來更加形象的說明如何求得。如下表:

A 1 2 3 4 2 6
B 1 1

現在已經確定B中兩個孩子的最少糖果數,然後:

1. B[0]=1,那麼B[1]=2,B[2]=3,B[3]=4,是一定的。原因是要滿足題目中的第2個條件。

2. 同理,B[5]=2。

3. 上面的是按照資料的正向看的,如果逆向,則B[3]=2,因為B[4]=1。這時,出現了衝突,要滿足最少的糖果數,似乎要取B[3]=2,但是不滿足條件2.所以遇到這個情況,則選取較大的。得到表格如下:
A 1 2 3 4 2 6
B 1 2 3 4 1 2

則最少糖果數為(1+2+3+4+1+2) = 13個。

總結演算法步驟如下:

1. 找到陣列的波谷,將波谷的孩子的糖果數設定為1.此步:時間複雜度O(n),空間複雜度O(n)

2. 從左到右遍歷陣列,從每一個1開始,其後的孩子的糖果比前一個孩子多1個,直到波峰。此步:時間複雜度O(n)

3. 從右向左遍歷陣列,從每一個1開始,其後的孩子的糖果比前一個孩子多1個。波峰的孩子,與2步中的相比,取最大的糖果個數。

4. B陣列每一個元素求和,即可得到最少需要的糖果數。

整體演算法的時間複雜度為O(n),空間複雜度為O(n)。進一步優化,可以將找波谷的一次迴圈省略。

【分析完畢】

本文來自微信:待字閨中,2013-10-06釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章