當(dāng) xx 號房間中有 yy 號房間的鑰匙時(shí),我們就可以從 xx 號房間去往 yy 號房間。如果我們將這 nn 個(gè)房間看成有向圖中的 nn 個(gè)節(jié)點(diǎn),那么上述關(guān)系就可以看作是圖中的 xx 號點(diǎn)到 yy 號點(diǎn)的一條有向邊。
使用深度優(yōu)先搜索的方式遍歷整張圖,統(tǒng)計(jì)可以到達(dá)的節(jié)點(diǎn)個(gè)數(shù),并利用數(shù)組 vis 標(biāo)記當(dāng)前節(jié)點(diǎn)是否訪問過,以防止重復(fù)訪問。 復(fù)雜度
classSolution{boolean[] vis;int num;publicbooleancanVisitAllRooms(List<List<Integer>> rooms){int n = rooms.size();num =0;vis =newboolean[n];dfs(rooms,0);return num == n;}publicvoiddfs(List<List<Integer>> rooms,int x){vis[x]=true;num++;for(int it : rooms.get(x)){if(!vis[it]){dfs(rooms, it);}}}}
2. BFS
用廣度優(yōu)先搜索的方式遍歷整張圖,統(tǒng)計(jì)可以到達(dá)的節(jié)點(diǎn)個(gè)數(shù),并利用數(shù)組 vis /Set標(biāo)記當(dāng)前節(jié)點(diǎn)是否訪問過,以防止重復(fù)訪問。 復(fù)雜度
classSolution{publicbooleancanVisitAllRooms(List<List<Integer>> rooms){int n = rooms.size(), num =0;boolean[] vis =newboolean[n];Queue<Integer> que =newLinkedList<Integer>();vis[0]=true;que.offer(0);while(!que.isEmpty()){int x = que.poll();num++;for(int it : rooms.get(x)){if(!vis[it]){vis[it]=true;que.offer(it);}}}return num == n;}}publicbooleancanVisitAllRooms(List<List<Integer>> rooms){Stack<Integer> a =newStack<>();HashSet<Integer> set =newHashSet<Integer>();set.add(0);a.add(0);while(!a.isEmpty()){int i =a.pop();for(int j:rooms.get(i)){if(!set.contains(j)){a.add(j);set.add(j);if(rooms.size()== set.size())returntrue;}}}return(rooms.size()== set.size());}