102. 103. 107. | 寬度優(yōu)先搜索(BFS)
? BFS,其英文全稱是Breadth First Search,寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡(jiǎn)便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹(shù)算法都采用了和寬度優(yōu)先搜索類似的思想。它屬于盲目搜尋法,目的是系統(tǒng)地展開(kāi)并檢查圖中的所有節(jié)點(diǎn),以找尋結(jié)果。換句話說(shuō),它并不考慮結(jié)果的可能位置,徹底地搜索整張圖,直到找到結(jié)果為止。
??從算法的觀點(diǎn),所有因?yàn)檎归_(kāi)節(jié)點(diǎn)而得到的子節(jié)點(diǎn)都會(huì)被加進(jìn)一個(gè)先進(jìn)先出的隊(duì)列中。一般的實(shí)驗(yàn)里,其鄰居節(jié)點(diǎn)尚未被檢驗(yàn)過(guò)的節(jié)點(diǎn)會(huì)被放置在一個(gè)被稱為 open 的容器中(例如隊(duì)列或是鏈表),而被檢驗(yàn)過(guò)的節(jié)點(diǎn)則被放置在被稱為 closed 的容器中。(open-closed表)。



分析:
? BFS通常采用層次遍歷的方式來(lái)遍歷整個(gè)圖(樹(shù)),它利用隊(duì)列數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)未遍歷過(guò)的但即將遍歷的點(diǎn)(open-list),因此如何判斷已經(jīng)遍歷完一層,是非常關(guān)鍵的一點(diǎn)。
? 在這題里,隊(duì)列中存儲(chǔ)的都是同一層的節(jié)點(diǎn),因此可以直接拿來(lái)計(jì)算。

? ?兩道題的唯一區(qū)別就是最后 res 的插入方式,一個(gè)是insert插入到開(kāi)頭,一個(gè)是push_back插入到尾部。
? 提交后發(fā)現(xiàn),insert函數(shù)比push_back函數(shù)要慢的多,因此107.這題要優(yōu)化的話,可以從這個(gè)點(diǎn)入手。


分析:
? 還是一樣的題目,只需要加入個(gè)條件判斷是否到了需要翻轉(zhuǎn)節(jié)點(diǎn)順序的層數(shù)即可。

??