1. 程式人生 > 其它 >leetcode 210. 課程表 II

leetcode 210. 課程表 II

現在你總共有 n 門課需要選,記為0到n-1。

在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 ,你需要先完成課程1 ,我們用一個匹配來表示他們: [0,1]

給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。

可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回一個空陣列。

示例1:

輸入: 2, [[1,0]]
輸出: [0,1]
解釋:總共有 2 門課程。要學習課程 1,你需要先完成課程 0。因此,正確的課程順序為 [0,1] 。
示例2:

輸入: 4, [[1,0],[2,0],[3,1],[3,2]]
輸出: [0,1,2,3] or [0,2,1,3]
解釋:總共有 4 門課程。要學習課程 3,你應該先完成課程 1 和課程 2。並且課程 1 和課程 2 都應該排在課程 0 之後。
因此,一個正確的課程順序是[0,1,2,3] 。另一個正確的排序是[0,2,1,3] 。
說明:

輸入的先決條件是由邊緣列表表示的圖形,而不是鄰接矩陣。詳情請參見圖的表示法。
你可以假定輸入的先決條件中沒有重複的邊。
提示:

這個問題相當於查詢一個迴圈是否存在於有向圖中。如果存在迴圈,則不存在拓撲排序,因此不可能選取所有課程進行學習。
通過 DFS 進行拓撲排序 - 一個關於Coursera的精彩視訊教程(21分鐘),介紹拓撲排序的基本概念。
拓撲排序也可以通過BFS完成。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/course-schedule-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

1:用Map<Integer, List<Integer>> all 來記錄需要課之間的關係。

2:用Map<Integer, Integer> map來記錄每個節點的引用次數v。

3:吧次數為0的節點放入棧中, 並把all中對應的節點的次數v都-1.

4:若v== 0,則放入棧中。

5:最終棧中沒有元素,並且所有的節點都從棧中彈出過,則說明符合要求。

6:把從棧中彈出的資料和二維陣列中沒有出現的資料,依次放入陣列中。

   public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] r = new int[numCourses];
        if (prerequisites == null
|| prerequisites.length == 0 || prerequisites[0].length == 0) { for (int i = 0; i < numCourses; i++) { r[i] = i; } return r; } int length = prerequisites.length; Stack<Integer> stack = new Stack<>(); Map<Integer, Integer> map = new HashMap<>(); Map<Integer, List<Integer>> all = new HashMap<>(); for (int i = 0; i < length; i++) { int[] arr = prerequisites[i]; List<Integer> item = all.computeIfAbsent(arr[1], k -> new ArrayList<>()); item.add(arr[0]); map.putIfAbsent(arr[1], 0); map.merge(arr[0], 1, (a, b) -> a + b); } for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if (entry.getValue() == 0) { stack.add(entry.getKey()); } } int count = 0; int size = map.size(); while (!stack.isEmpty() && count < size) { Integer pop = stack.pop(); List<Integer> list = all.get(pop); r[count++] = pop; if (list == null) { continue; } for (Integer item : list) { int v = map.get(item) - 1; if (v == 0) { stack.add(item); } map.put(item, v); } } if (stack.isEmpty() && count == size) { for (int i = 0; i < numCourses; i++) { if (map.get(i) == null) { r[count++] = i; } } return r; } else { return new int[0]; } }