日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]

【解答思路】

1. 拓撲排序

復雜度分析

HashSet[] 數組

import java.util.HashSet; import java.util.LinkedList; import java.util.Queue;public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {if (numCourses <= 0) {return false;}// 特判int pLen = prerequisites.length;if (pLen == 0) {return true;}int[] inDegree = new int[numCourses];HashSet<Integer>[] adj = new HashSet[numCourses];for (int i = 0; i < numCourses; i++) {adj[i] = new HashSet<>();}for (int[] p : prerequisites) {inDegree[p[0]]++;adj[p[1]].add(p[0]);}Queue<Integer> queue = new LinkedList<>();// 首先加入入度為 0 的結點for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.add(i);}}// 記錄已經出隊的課程數量int cnt = 0;while (!queue.isEmpty()) {Integer top = queue.poll();cnt += 1;// 遍歷當前出隊結點的所有后繼結點for (int successor : adj[top]) {inDegree[successor]--;if (inDegree[successor] == 0) {queue.add(successor);}}}return cnt == numCourses;} }

List<List>

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] indegrees = new int[numCourses];List<List<Integer>> adjacency = new ArrayList<>();Queue<Integer> queue = new LinkedList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());// Get the indegree and adjacency of every course.for(int[] cp : prerequisites) {indegrees[cp[0]]++;adjacency.get(cp[1]).add(cp[0]);}// Get all the courses with the indegree of 0.for(int i = 0; i < numCourses; i++)if(indegrees[i] == 0) queue.add(i);// BFS TopSort.while(!queue.isEmpty()) {int pre = queue.poll();numCourses--;for(int cur : adjacency.get(pre))if(--indegrees[cur] == 0) queue.add(cur);}return numCourses == 0;} }
2. DFS


復雜度

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> adjacency = new ArrayList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());int[] flags = new int[numCourses];for(int[] cp : prerequisites)adjacency.get(cp[1]).add(cp[0]);for(int i = 0; i < numCourses; i++)if(!dfs(adjacency, flags, i)) return false;return true;}private boolean dfs(List<List<Integer>> adjacency, int[] flags, int i) {if(flags[i] == 1) return false;if(flags[i] == -1) return true;flags[i] = 1;for(Integer j : adjacency.get(i))if(!dfs(adjacency, flags, j)) return false;flags[i] = -1;return true;} }

【總結】

1. 拓撲排序

拓撲排序實際上應用的是貪心算法。貪心算法簡而言之:每一步最優,全局就最優。

具體到拓撲排序,每一次都從圖中刪除沒有前驅的頂點,這里并不需要真正的做刪除操作,我們可以設置一個入度數組,每一輪都輸出入度為 00 的結點,并移除它、修改它指向的結點的入度(-1?1即可),依次得到的結點序列就是拓撲排序的結點序列。如果圖中還有結點沒有被移除,則說明“不能完成所有課程的學習”。

拓撲排序保證了每個活動(在這題中是“課程”)的所有前驅活動都排在該活動的前面,并且可以完成所有活動。拓撲排序的結果不唯一。拓撲排序還可以用于檢測一個有向圖是否有環。相關的概念還有 AOV 網,這里就不展開了。




2.拓撲排序

1.統計箭頭指向的度
2.度為0的入隊
3.統計層數 出隊 相關度減一且度為0入隊
4.隊為空作判斷

3.相關題目[Leedcode][JAVA][第210 題][課程表 II][拓撲排序][BFS][DFS][有向圖]

轉載鏈接:https://leetcode-cn.com/problems/course-schedule/solution/tuo-bu-pai-xu-by-liweiwei1419/
作者:Krahets
轉載鏈接:https://leetcode-cn.com/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/

總結

以上是生活随笔為你收集整理的[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。