leetcode802 找到最終的安全狀態

2021-10-09 08:58:05 字數 1134 閱讀 3552

題目的特點就是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 步後必能停止在乙個終點。哪些節點最終是安全的?...