題目的特點就是dfs,一旦發現這條路徑上有的點重複出現了,那麼這條路徑就被乾掉。因此需要乙個set來儲存已經遍歷過的路徑。
一直對於dfs中這種set儲存問題搞不明白,就比如說什麼時候刪除?怎麼樣才不會導致其中儲存的資料能夠代表當前路徑的數,不會混亂?
下面是杰哥幫我修正的一版**,基本思路是正確的,面對較大陣列時會超時,那麼就需要用map來進行儲存記憶了。也就是記錄某個點是否為安全點,這樣再遍歷到當前點的時候可以直接判斷。(map中需要儲存三種狀態,能,否,沒遇到過)。
class
solution
}return res;
}public
boolean
dfs(
int[
] graph, hashset
set,
int pos)
if(graph[pos]
.length==0)
return
true
; set.
add(pos)
;for
(int j : graph[pos]);
} set.
remove
(pos)
;return
true;}
}```
其實就是判斷陣列中的所有節點中哪個是滿足條件的,需要從每個節點向下探索。因此開頭有了個for迴圈,直接用if語句進行判斷,ok的話就把這個節點新增進去。
如果當前節點已經存在於set中,就返回false
如果不存在,同時該節點對應位置的的陣列長度為0,也就是為終點,那麼就返回true
以上兩個都不符合的話,就把它新增進去,然後遍歷他的孩子們,判斷他的孩子們是否為安全節點,那麼此處就開始dfs了。一旦有乙個孩子返回的為false,那麼此節點的的路就不符合要求,那麼就要返回false,在這之前也要在set中remove掉。
如果遍歷完都ok的話,那麼就要返回true,在這之前也是要在set中remove掉。
無論是返回false還是true都是要remove的。用意就是已經判斷完當前點,接下來要判斷同級別的其他節點了,那麼當前節點是不能存在的,必須要remove,否則就會引起資料的混亂。
關於map的使用,日後再新增。
LeetCode 802 找到最終的安全狀態
在有向圖中,我們從某個節點和每個轉向處開始,沿著圖的有向邊走。如果我們到達的節點是終點 即它沒有連出的有向邊 我們停止。現在,如果我們最後能走到終點,那麼我們的起始節點是最終安全的。更具體地說,存在乙個自然數 k,無論選擇從 開始行走,我們走了不到 k 步後必能停止在乙個終點。哪些節點最終是安全的?...
Leetcode 802 找到最終的安全狀態
在有向圖中,我們從某個節點和每個轉向處開始,沿著圖的有向邊走。如果我們到達的節點是終點 即它沒有連出的有向邊 我們停止。現在,如果我們最後能走到終點,那麼我們的起始節點是最終安全的。更具體地說,存在乙個自然數 k,無論選擇從 開始行走,我們走了不到 k 步後必能停止在乙個終點。哪些節點最終是安全的?...
802 找到最終的安全狀態
在有向圖中,我們從某個節點和每個轉向處開始,沿著圖的有向邊走。如果我們到達的節點是終點 即它沒有連出的有向邊 我們停止。現在,如果我們最後能走到終點,那麼我們的起始節點是最終安全的。更具體地說,存在乙個自然數 k,無論選擇從 開始行走,我們走了不到 k 步後必能停止在乙個終點。哪些節點最終是安全的?...