拷貝連結串列;及糖果分析
今日面試題:拷貝連結串列
有一個連結串列,每一個節點除了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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 加油站;及拷貝連結串列分析
- JavaScript物件的深拷貝以及淺拷貝分析JavaScript物件
- Linux 下拷貝目錄及打包壓縮拷貝Linux
- python深拷貝和淺拷貝之簡單分析Python
- 再次分析壞盤拷貝
- 快排單連結串列;及乾坤大挪移的分析
- 最多連續數的子集及單連結串列和之戀分析及解答
- JS深拷貝總結JS
- vue深拷貝淺拷貝Vue
- python 指標拷貝,淺拷貝和深拷貝Python指標
- Linux下的軟連結和硬連結,檔案拷貝的區別Linux
- 一文搞懂Java引用拷貝、淺拷貝、深拷貝Java
- jquery之物件拷貝深拷貝淺拷貝案例講解jQuery物件
- C++拷貝建構函式(深拷貝,淺拷貝)C++函式
- iOS深拷貝和淺拷貝iOS
- JS深拷貝與淺拷貝JS
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- javascript 淺拷貝VS深拷貝JavaScript
- JavaScript 深度拷貝和淺拷貝JavaScript
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- js深拷貝和淺拷貝JS
- js 深拷貝 vs 淺拷貝JS
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- iOS深淺拷貝小結iOS
- 淺談深拷貝與淺拷貝?深拷貝幾種方法。
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 糖果;及子串查詢分析
- C++淺拷貝和深拷貝C++
- 深拷貝、淺拷貝與Cloneable介面
- 賦值、淺拷貝與深拷貝賦值
- 實現物件淺拷貝、深拷貝物件
- Python淺拷貝與深拷貝Python
- go slice深拷貝和淺拷貝Go