[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]
【問題描述】[中等]
【解答思路】
1. 拓?fù)渑判?/h6>
復(fù)雜度分析
HashSet[] 數(shù)組
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
復(fù)雜度
【總結(jié)】
1. 拓?fù)渑判?/h6>
拓?fù)渑判驅(qū)嶋H上應(yīng)用的是貪心算法。貪心算法簡(jiǎn)而言之:每一步最優(yōu),全局就最優(yōu)。
具體到拓?fù)渑判?#xff0c;每一次都從圖中刪除沒有前驅(qū)的頂點(diǎn),這里并不需要真正的做刪除操作,我們可以設(shè)置一個(gè)入度數(shù)組,每一輪都輸出入度為 00 的結(jié)點(diǎn),并移除它、修改它指向的結(jié)點(diǎn)的入度(-1?1即可),依次得到的結(jié)點(diǎn)序列就是拓?fù)渑判虻慕Y(jié)點(diǎn)序列。如果圖中還有結(jié)點(diǎn)沒有被移除,則說明“不能完成所有課程的學(xué)習(xí)”。
拓?fù)渑判虮WC了每個(gè)活動(dòng)(在這題中是“課程”)的所有前驅(qū)活動(dòng)都排在該活動(dòng)的前面,并且可以完成所有活動(dòng)。拓?fù)渑判虻慕Y(jié)果不唯一。拓?fù)渑判蜻€可以用于檢測(cè)一個(gè)有向圖是否有環(huán)。相關(guān)的概念還有 AOV 網(wǎng),這里就不展開了。
2.拓?fù)渑判?/h6>
1.統(tǒng)計(jì)箭頭指向的度
2.度為0的入隊(duì)
3.統(tǒng)計(jì)層數(shù) 出隊(duì) 相關(guān)度減一且度為0入隊(duì)
4.隊(duì)為空作判斷
3.相關(guān)題目[Leedcode][JAVA][第210 題][課程表 II][拓?fù)渑判騗[BFS][DFS][有向圖]
轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/course-schedule/solution/tuo-bu-pai-xu-by-liweiwei1419/
作者:Krahets
轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/
總結(jié)
以上是生活随笔為你收集整理的[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 抽象类、接口和构析方法
- 下一篇: 【数据结构与算法】排序优化