LeetCode210——課程表II
阿新 • • 發佈:2018-11-06
我的LeetCode程式碼倉:https://github.com/617076674/LeetCode
原題連結:https://leetcode-cn.com/problems/course-schedule-ii/description/
題目描述:
知識點:拓撲排序
思路:拓撲排序
本題的實現和LeetCode207——課程表一模一樣,只不過在拓撲排序的時候多用了一個數組來記錄順序。
時間複雜度和空間複雜度均是O(n)。
JAVA程式碼:
public class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[] inDegree = new int[numCourses]; int[][] graph = new int[numCourses][numCourses]; for(int i = 0; i < prerequisites.length; i++){ graph[prerequisites[i][1]][prerequisites[i][0]] = 1; inDegree[prerequisites[i][0]]++; } Queue<Integer> queue = new LinkedList<>(); for(int i = 0; i < numCourses; i++){ if(inDegree[i] == 0){ queue.add(i); } } int[] result = new int[numCourses]; int index = 0; int num = 0; while(!queue.isEmpty()){ int u = queue.poll(); result[index++] = u; for(int v = 0; v < numCourses; v++){ if(graph[u][v] != 0){ inDegree[v]--; if(inDegree[v] == 0){ queue.add(v); } } } num++; } if(num != numCourses){ result = new int[0]; } return result; } }
JAVA解題報告:
C++程式碼:
class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { int inDegree[numCourses] = {0}; vector<int> graph[numCourses]; for(int i = 0; i < prerequisites.size(); i++){ graph[prerequisites[i].second].push_back(prerequisites[i].first); inDegree[prerequisites[i].first]++; } queue<int> q; for(int i = 0; i < numCourses; i++){ if(inDegree[i] == 0){ q.push(i); } } int num = 0; vector<int> result; while(!q.empty()){ int u = q.front(); result.push_back(u); q.pop(); for(int j = 0; j < graph[u].size(); j++){ int v = graph[u][j]; inDegree[v]--; if(inDegree[v] == 0){ q.push(v); } } num++; } if(num != numCourses){ result.clear(); } return result; } };
C++解題報告: