日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Breadth-first Search 】专题3

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Breadth-first Search 】专题3 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

529 Minesweeper

輸入:一個(gè)二維矩陣,一些修改規(guī)則。
 如果點(diǎn)到一個(gè)隱藏的地雷M,把它改為X,游戲結(jié)束
 如果點(diǎn)到一個(gè)E,且其周?chē)?鄰接的范圍沒(méi)有地雷,那么應(yīng)該把8鄰接的范圍的格子全部翻開(kāi)為E
 如果翻開(kāi)的格子的八鄰接范圍有隱藏的地雷,就將其標(biāo)注了地雷的數(shù)目1-8而非E。(規(guī)則拷貝鏈接)

輸出:掃雷后的矩陣。
分析:從第二條規(guī)則可以看到這是需要迭代遞歸的。遞歸過(guò)程可以從一個(gè)節(jié)點(diǎn)開(kāi)始,不斷查找鄰接點(diǎn),擴(kuò)展下去,也可以沿著節(jié)點(diǎn)一層一層擴(kuò)展下去。前者是DFS,后者是BFS。和前面的幾道題目是一樣的。
這個(gè)題目的難點(diǎn)1是英語(yǔ)問(wèn)題,沒(méi)有理解 If an empty square (‘E’) with no adjacent mines is revealed, then change it to revealed blank (‘B’) and all of its adjacent unrevealed squares should be revealed recursively。 難點(diǎn)2 是計(jì)算鄰接點(diǎn)坐標(biāo)變化的change數(shù)組。知道8個(gè)方向上x(chóng)y坐標(biāo)值得變化。
 看代碼會(huì)發(fā)現(xiàn),依然使用的是BFS的模板。有了套路真好。有時(shí)間再回頭看看DFS的套路。整個(gè)做完DFS并沒(méi)有目前對(duì)BFS的套路感覺(jué)。
代碼

102. Binary Tree Level Order Traversal

我認(rèn)為不值得再寫(xiě)個(gè)新文章。如果從BFS的習(xí)題練習(xí)到這里,大概已經(jīng)形成思路。套用即可。最近在用idea寫(xiě)LeetCode的代碼。我認(rèn)為idea就是開(kāi)發(fā)工具界的搜狗輸入法。好用,好用,真好用。
代碼

199. Binary Tree Right Side View

輸入:二叉樹(shù)
輸出:從右邊站著看二叉樹(shù),從上到下得到的值。
分析:這與102比較,102要求記下一層中的每一個(gè)節(jié)點(diǎn)的值,199要求記錄下一層中最右邊節(jié)點(diǎn)的值。用BFS思路的話,只要把上一題的代碼拷貝過(guò)來(lái),改改即可。用DFS思路的話,也是拷貝上一題的代碼,改改就能跑起來(lái)。如果能先遍歷左節(jié)點(diǎn),每層只調(diào)用一次list的add方法,速度會(huì)更快。
代碼

863. All Nodes Distance K in Binary Tree

輸入:二叉樹(shù),目標(biāo)節(jié)點(diǎn),距離K
輸出:所有距離目標(biāo)節(jié)點(diǎn)距離K路徑的節(jié)點(diǎn)值列表
思路1:

首先找到根節(jié)點(diǎn)距離target node 的距離 rootDistance;
其次,存儲(chǔ)所有節(jié)點(diǎn)與父節(jié)點(diǎn)的map
最后,一個(gè)節(jié)點(diǎn)距離目標(biāo)節(jié)點(diǎn)的距離t = 其父節(jié)點(diǎn)距離目標(biāo)的節(jié)點(diǎn) + 1
假設(shè)dist[i] 表示值為i的節(jié)點(diǎn)距離目標(biāo)節(jié)點(diǎn)的距離。dist[3]=1,dist[5]=0,dist[1]=dist[3]+1,dist[2]=dist[5]+1。考慮到這里,我就認(rèn)為dist[node]=dist[node.parent]+1.假設(shè)在node3和node5之間加一個(gè)節(jié)點(diǎn)node9,實(shí)際dist[9]=1,按照公式dist[9]=dist[3]+1.不正確。
這種通過(guò)一兩個(gè)節(jié)點(diǎn)(特例)來(lái)總結(jié)規(guī)律的情況,需要考慮全所有的情況。

糾正思路1:
1 樹(shù)的遍歷不一定非要從跟節(jié)點(diǎn)開(kāi)始
2 直觀地看。如果target 在一個(gè)節(jié)點(diǎn)的左子樹(shù),距離為dist,則這個(gè)節(jié)點(diǎn)的右子樹(shù)上距離為K-dist的節(jié)點(diǎn)都符合要求。當(dāng)然,target節(jié)點(diǎn)子樹(shù)上再遍歷K層的元素也符合要求。例如目標(biāo)節(jié)點(diǎn)是6,K=2。節(jié)點(diǎn)5與節(jié)點(diǎn)6距離為1,那么節(jié)點(diǎn)5的右子樹(shù)上,與節(jié)點(diǎn)5距離為K-1=1的節(jié)點(diǎn)符合要求。節(jié)點(diǎn)6距離節(jié)點(diǎn)3的距離為2,節(jié)點(diǎn)3符合要求。當(dāng)然對(duì)于節(jié)點(diǎn)6的子節(jié)點(diǎn),距離為K的子節(jié)點(diǎn)也符合要求。
3 如果 target在右子樹(shù)上,情形也是一樣的。
這道題目最好不要看做樹(shù),而是看做圖。因?yàn)楫?dāng)看做樹(shù)的時(shí)候會(huì)更多的去考慮父子關(guān)系和父子節(jié)點(diǎn)。如果看做圖,則所有節(jié)點(diǎn)地位相同。
代碼方法:distanceKV2

思路2:
1 存儲(chǔ)所有節(jié)點(diǎn)與父節(jié)點(diǎn)的map。
2 將node5加入到隊(duì)列。dist=0。
3如果dist<K, 彈出隊(duì)列所有元素,將每個(gè)元素的子節(jié)點(diǎn),父節(jié)點(diǎn)加入到隊(duì)列。dist++。調(diào)回2。
4如果dist=K,彈出隊(duì)列所有元素,將元素值放入list中,作為結(jié)果集。
做的過(guò)程中會(huì)發(fā)現(xiàn)有重復(fù)處理的元素,不合理的結(jié)果。這時(shí)候用一個(gè)set,在加入到隊(duì)列之前,判斷一下是否已經(jīng)處理過(guò)。
代碼方法:distanceK
代碼

總結(jié)

以上是生活随笔為你收集整理的【Breadth-first Search 】专题3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。