802. 找到最终的安全状态
在有向圖中,以某個節(jié)點(diǎn)為起始節(jié)點(diǎn),從該點(diǎn)出發(fā),每一步沿著圖中的一條有向邊行走。如果到達(dá)的節(jié)點(diǎn)是終點(diǎn)(即它沒有連出的有向邊),則停止。
對于一個起始節(jié)點(diǎn),如果從該節(jié)點(diǎn)出發(fā),無論每一步選擇沿哪條有向邊行走,最后必然在有限步內(nèi)到達(dá)終點(diǎn),則將該起始節(jié)點(diǎn)稱作是 安全 的。
返回一個由圖中所有安全的起始節(jié)點(diǎn)組成的數(shù)組作為答案。答案數(shù)組中的元素應(yīng)當(dāng)按 升序 排列。
該有向圖有 n 個節(jié)點(diǎn),按 0 到 n - 1 編號,其中 n 是?graph?的節(jié)點(diǎn)數(shù)。圖以下述形式給出:graph[i] 是編號 j 節(jié)點(diǎn)的一個列表,滿足 (i, j) 是圖的一條有向邊。
- 示例 1:
輸入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
輸出:[2,4,5,6]
解釋:示意圖如上。
- 示例 2:
輸入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]]
輸出:[4]
提示:
n == graph.length
1 <= n <= 104
0 <= graph[i].length <= n
graph[i] 按嚴(yán)格遞增順序排列。
圖中可能包含自環(huán)。
圖中邊的數(shù)目在范圍 [1, 4 * 104] 內(nèi)。
解題思路
這題原來的路徑是從起點(diǎn)經(jīng)過所以的可能路徑都能到達(dá)終點(diǎn),也就是說我們路徑上不能產(chǎn)生環(huán),我們可以使用拓?fù)渑判騺頇z查是否有環(huán)的產(chǎn)生。
代碼
class Solution {public List<Integer> eventualSafeNodes(int[][] graph) {int n = graph.length;Queue<Integer> queue=new LinkedList<>();Map<Integer,List<Integer>> map=new HashMap<>();int[] degree=new int[n];for (int i = 0; i < graph.length; i++) {for (int j : graph[i]) {map.putIfAbsent(j,new ArrayList<Integer>());map.get(j).add(i);}degree[i]=graph[i].length;if (degree[i]==0)queue.add(i);}while (!queue.isEmpty()){Integer cur = queue.poll();for (Integer next : map.getOrDefault(cur, new ArrayList<>())) {if (--degree[next]==0)queue.add(next);}}ArrayList<Integer> res = new ArrayList<>();for (int i = 0; i < n; i++) {if (degree[i]==0)res.add(i);}return res;} }總結(jié)
以上是生活随笔為你收集整理的802. 找到最终的安全状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 581. 最短无序连续子数组
- 下一篇: 1137. 第 N 个泰波那契数