leetcode 找到最終安全狀態
阿新 • • 發佈:2021-08-05
這道題最初我的想法是遍歷+BFS但時間超了,所以在這裡給一個官方的解答:
深度優先搜尋 + 三色標記法
根據題意,若起始節點位於一個環內,或者能到達一個環,則該節點不是安全的。否則,該節點是安全的。
我們可以使用深度優先搜尋來找環,並在深度優先搜尋時,用三種顏色對節點進行標記,標記的規則如下:
白色(用 00 表示):該節點尚未被訪問;
灰色(用 11 表示):該節點位於遞迴棧中,或者在某個環上;
黑色(用 22 表示):該節點搜尋完畢,是一個安全節點。
當我們首次訪問一個節點時,將其標記為灰色,並繼續搜尋與其相連的節點。
如果在搜尋過程中遇到了一個灰色節點,則說明找到了一個環,此時退出搜尋,棧中的節點仍保持為灰色,這一做法可以將「找到了環」這一資訊傳遞到棧中的所有節點上。
如果搜尋過程中沒有遇到灰色節點,則說明沒有遇到環,那麼遞迴返回前,我們將其標記由灰色改為黑色,即表示它是一個安全的節點。
連結:https://leetcode-cn.com/problems/find-eventual-safe-states/solution/zhao-dao-zui-zhong-de-an-quan-zhuang-tai-yzfz/
class Solution { public List<Integer> eventualSafeNodes(int[][] graph) { int n = graph.length; int[] color = newint[n]; List<Integer> ans = new ArrayList<Integer>(); for (int i = 0; i < n; ++i) { if (safe(graph, color, i)) { ans.add(i); } } return ans; } public boolean safe(int[][] graph, int[] color, int x) {if (color[x] > 0) { return color[x] == 2; } color[x] = 1; for (int y : graph[x]) { if (!safe(graph, color, y)) { return false; } } color[x] = 2; return true; } }