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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Depth-first Search深度优先搜索专题2

發(fā)布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Depth-first Search深度优先搜索专题2 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

199. Binary Tree Right Side View

思路:想要得到樹的每一層最右側(cè)元素值,用BFS最方便。先訪問左節(jié)點再訪問右節(jié)點,最后訪問的一個值就是留下的值。
想要DFS的思路也可以。只是一定要訪問所有節(jié)點。

代碼

491 Increasing Subsequences

思路:我的習慣思維是對于nums[idx]可以選擇取或者不取。取的話,在什么條件下可以取。滿足什么條件的結(jié)果可以記錄到結(jié)果中。想好這些就能寫代碼了。
本題:list記錄上一步已經(jīng)取的數(shù)字。如果if (list.size() == 0 || nums[idx] >= list.get(list.size()-1)) 的時候就可以取當前元素到列表。只要list.size 大于等于2 就可以加入結(jié)果集。題目還需要去重。
學習:還有一種dfs的思路是:findSequence(int[] nums, int idx, Deque<Integer> list, Set<List<Integer>> result) 前一步放入list中的最后一個元素的下標是idx-1,當前可以決定繼續(xù)加入的元素是從idx到數(shù)組末尾中的任何一個元素,當然元素也是要符合條件的。
代碼

785. Is Graph Bipartite?

思路:要把所有的頂點(下標)分為兩個集合lista 和listb。先往lista加入節(jié)點0。和0相鄰的點加listb。再不斷遍歷lista和listb,加入新的節(jié)點。如果相鄰節(jié)點在同一個list中那就返回false。代碼啰嗦笨拙,參見isBipartiteV2。
學習1:用colors數(shù)組來區(qū)分兩個集合。-1認為還沒有加顏色;0為一組;1為另外一組。在加顏色過程中使用DFS的思路。
例如輸入: [[1,3], [0,2], [1,3], [0,2]]。
染色順序:從0到1;從1到2;從2到3;3的鄰邊已經(jīng)染色完成,判斷是不是有效就行。
學習2:思路同上。在加顏色過程中使用BFS的思路。
例如輸入: [[1,3], [0,2], [1,3], [0,2]]。
染色順序:從0到1;從0到3;1,3加入隊列;一邊染色,一邊判斷是否有效;
從1到0,從1到2;2加入隊列;一邊染色,一邊判斷是否有效;
從3到0,從3到2;一邊染色,一邊判斷是否有效;
從2到1,從2到3;
代碼

129. Sum Root to Leaf Numbers

思路:深度優(yōu)先的套路。在處理每個當前節(jié)點node的時候把它當做根節(jié)點,繼續(xù)dfs;找到node與其根節(jié)點關(guān)系,再定返回值。
代碼

200. Number of Islands

思路:用DFS的思路很簡單。找到一個島嶼的起點(i,j),不斷向4個方向擴散,把相鄰的節(jié)點都改為2。這樣一次完整的dfs遍歷算是一個島嶼識別完成。接著再找下個島嶼的起點。
學習:UnionFind并查集思路。將二維的grid,用一維數(shù)組表示父節(jié)點信息。
代碼

116. Populating Next Right Pointers in Each Node

思路:dfs的話,先遍歷一個節(jié)點的右子樹,在同一深度保持盡可能的右側(cè)節(jié)點。但是當同一層的節(jié)點稱為別的節(jié)點的next后,當前節(jié)點就成為該層右側(cè)節(jié)點了。用一個map來存儲。
學習:同一層次的節(jié)點向右指向next,其實用BFS的思路最好。不過看別的代碼,這次BFS沒有使用queue來解決,而是巧妙的使用了dummy.next和節(jié)點next,將同一層的節(jié)點連起來。是學習的地方。
代碼

114. Flatten Binary Tree to Linked List

思路:dfs的思路。今天的收獲是:起一個好的方法名字有利于自己思路形成。以前的代碼都直接將方法命名為dfs,其實不知道在做什么。今天的方法名flattenNode,是對node這一個節(jié)點做展開。能夠理清楚一個節(jié)點做展開應(yīng)該做哪些事情,遞歸就好寫了。
??????
觀察發(fā)現(xiàn),例如處理node3,不需要做什么事情。處理node2,能看到node4變成了node3的右子樹;node3變成了node2的右子樹。得出如果有左子樹,那么左子樹稱為node的右子樹,原來node的右子樹成為現(xiàn)在node右子樹葉子節(jié)點的右子樹。把node的左子樹置為null。
代碼

802. Find Eventual Safe States

思路:開始不能明白k的作用,不能明白例題中0,1,3節(jié)點為什么就不可以。
我理解的5,6出度為0,5,6是terminal node,肯定是safe state。節(jié)點2,節(jié)點4可以走到節(jié)點5,所以節(jié)點2,節(jié)點4也屬于safe state。節(jié)點0,節(jié)點1可以走到節(jié)點2,那么節(jié)點0,節(jié)點1也應(yīng)該是safe state。
節(jié)點3能夠走到節(jié)點0,那節(jié)點3也是safe state。所以0,1,2,3,4,5,6應(yīng)該都是safe state。
但題目中有句話是:starting node is eventually safe if and only if we must eventually walk to a terminal node.“ if and only if ”說明是可以并且只能走到safe state。
節(jié)點0可以走節(jié)點2,到達節(jié)點5,;但是同時節(jié)點0還可以走到節(jié)點1,節(jié)點3,再到節(jié)點0。沒有任何證據(jù)表名節(jié)點1,或者節(jié)點3不是terminal node,所以節(jié)點0也就不是safe state。也就是不符合 if and only if。這就清楚了,一個節(jié)點如果它的出度為0或者鏈接的節(jié)點都是safe state的,那它才是safe state。
學習:從一個節(jié)點開始深度優(yōu)先進行搜索。如果能夠走到終點并且只能走到終點則認為無環(huán),是一個safe state。我們將訪問節(jié)點的不同狀態(tài)稱為 白-灰-黑:還沒有開始訪問節(jié)點是白(0),開始訪問一個節(jié)點是灰(1),訪問一個節(jié)點結(jié)束是黑(2)。
如果在訪問節(jié)點A的過程中遇到了灰色的節(jié)點B,那么說明A在一個環(huán)內(nèi)。A不是一個safe state。
如果在訪問節(jié)點A的過程中所有的路徑都能達到一個terminal node,沒有進入環(huán)內(nèi),則A是一個safe state。
時間復雜度O(N+E) N是頂點數(shù),E是邊數(shù)。
代碼

總結(jié)

以上是生活随笔為你收集整理的Depth-first Search深度优先搜索专题2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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