加油站;及拷貝連結串列分析
今日面試題:加油站
城市的環形路有n個加油站,第i個加油站的油量用gas[i]來表示,你有如下的一輛車:
1. 它的油缸是無限量的,初始是空的
2. 它從第i個加油站到第i+1個加油站消耗油量為cost[i]
現在你可以從任意加油站開始,路過加油站可以不斷的加油,問是否能夠走完環形路。如果可以返回開始加油站的編號,如果不可以返回-1。注意,解決方案保證是唯一的。
================================================
拷貝連結串列分析
原題
有一個連結串列,每一個節點除了next指標指向一下節點以外,又多出了一個指標random,指向連結串列中的任何一個節點,包括null。請給出方法完成連結串列的深拷貝。
分析
這個問題的關鍵就在於random指標如何完成拷貝,next指標一次遍歷就完成了,random指標拷貝的關鍵在於,如何找到random指向的 節點對應的新的節點。一般來講,大家會想到用map來儲存舊的節點到新的節點的對映,這樣得到的方法的時間複雜度為O(n),空間複雜度為O(n)。下面 是一個可行的方法:oldlist為原始連結串列,copylist為新的連結串列,oldnode為oldlist中的節點,copynode為 copylist中的節點:
1. 根據oldlist,建立copylist,只拷貝next指標
2. 儲存oldnode到oldnode.next的對映
3. 將oldlist中的oldnode的next指標指向copylist中對應的copynode
4. 將copylist中的copynode的random指標指向oldlist中對應的oldnode
5. 對於copylist中的每一個節點:copynode.random=copynode.random.random.next
6. 根據第2步,建立的對映,恢復oldlist
上面這個方法,需要額外的對映。下面介紹一個巧妙的方法,可以省去對映的部分
1. 對oldlist中的節點,依次作如下的操作:對於第i個節點oldnode[i],生成拷貝節點copynode[i],並且插入在oldnode[i]和oldnode[i+1]之間,最後一個節點直接附加到oldlist後面即可。
2. 處理每一個copynode的random拷貝,及對每一個copynode=oldnode.next, oldnode.next.random=oldnode.random.next 後面的next確保是copynode。
3. 通過如下的操作,恢復oldlist,以及生成copylist 1) oldnode.next = oldnode.next.next 2) copynode.next = copynode.next.next 這裡要注意,oldnode的最後一個節點,next是null
注意題目中的random可能指向null,在上面第2步的時候處理一下就可以了。
【分析完畢】
本文來自微信:待字閨中,2013-10-08釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 拷貝連結串列;及糖果分析
- 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
- JavaScript之深拷貝和淺拷貝JavaScript