leetcode【210】【Depth-first Search】Course Schedule II【c++版本】
問題描述:
There are a total of n
courses you have to take labelled from 0
to n - 1
.
Some courses may have prerequisites
, for example, if prerequisites[i] = [ai, bi]
this means you must take the course bi
before the course ai
.
Given the total number of courses numCourses
and a list of the prerequisite
pairs, return the ordering of courses you should take to finish all courses.
If there are many valid answers, return any of them. If it is impossible to finish all courses, return an empty array.
Example 1:
Input: numCourses = 2, prerequisites = [[1,0]] Output: [0,1] Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1].
Example 2:
Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] Output: [0,2,1,3] Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3].
Example 3:
Input: numCourses = 1, prerequisites = [] Output: [0]
原始碼:
和上一題比較像leetcode【207】【Depth-first Search】Course Schedule【c++版本】,不過這一題需要找到序列,當然也可以用上一題類似的做法,但是在這裡我們考慮用一個佇列解決。
- 我們先為所有節點建立一個圖graph,並且計算他們的入度indegree;
- 將入度為0的點放入佇列points;
- 拿出隊首元素新增到result,將其相鄰的節點入度減一,再次將入度為0的節點放入佇列,重複多次直至佇列為空;
- result的長度是否等於節點個數numCourses,若不等於則說明沒有遍歷完,即存在環,返回空result;否則返回result。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> result;
vector<vector<int>> graph (numCourses, vector<int> (numCourses, 0));
vector<int> indegree(numCourses, 0);
queue<int> points;
for (int i=0; i<prerequisites.size(); i++) {
graph[prerequisites[i][1]][prerequisites[i][0]] = 1;
indegree[prerequisites[i][0]]++;
}
for (int i=0; i<numCourses; i++) {
if (indegree[i] == 0) {
points.push(i);
}
}
while (!points.empty()) {
int tmp = points.front();
points.pop();
result.push_back(tmp);
for (int i=0; i<numCourses; i++) {
if(graph[tmp][i] && --indegree[i] == 0) {
points.push(i);
}
}
}
if (result.size() != numCourses) {
return vector<int> ();
}
return result;
}
};
相關文章
- [LeetCode] 210. Course Schedule IILeetCode
- LeetCode 210 course schedule 2LeetCode
- LeetCode-Course Schedule IILeetCode
- LeetCode-Course ScheduleLeetCode
- LeetCode 207 Course ScheduleLeetCode
- Leetcode Search in Rotated Sorted Array IILeetCode
- [LeetCode] 212. Word Search IILeetCode
- LeetCode-Search in Rotated Sorted Array IILeetCode
- Search in Rotated Sorted Array II leetcode javaLeetCodeJava
- LeetCode-Search a 2D Matrix IILeetCode
- LeetCode 240 Search a 2D Matrix IILeetCode
- Leetcode-Unique Binary Search Trees IILeetCode
- Unique Binary Search Trees II leetcode javaLeetCodeJava
- LeetCode-Closest Binary Search Tree Value IILeetCode
- 【leetcode】 Unique Binary Search Trees II (middle)☆LeetCode
- LintCode-Word Search II
- LeetCode 59. 螺旋矩陣 II(python、c++)LeetCode矩陣PythonC++
- Leetcode Word SearchLeetCode
- Leetcode Search for a RangeLeetCode
- LeetCode—253.會議室 II(Meeting Rooms II)——分析及程式碼(C++)LeetCodeOOMC++
- LeetCode C++ 33. Search in Rotated Sorted Array【二分】中等LeetCodeC++
- Leetcode-Word SearchLeetCode
- LeetCode 34 Search for a RangeLeetCode
- Leetcode-Search for a rangeLeetCode
- Word Search leetcode javaLeetCodeJava
- Search for a Range leetcode javaLeetCodeJava
- 【LeetCode】253. Meeting Rooms II 解題報告(C++)LeetCodeOOMC++
- LintCode-Search 2D Matrix II
- leetcode34_Search for a RangeLeetCode
- Leetcode Search in Rotated Sorted ArrayLeetCode
- Leetcode Search Insert PositionLeetCode
- LeetCode C++ 441. Arranging Coins【Math/Binary Search】簡單LeetCodeC++
- [LeetCode] Jump Game IILeetCodeGAM
- Leetcode jump Game IILeetCodeGAM
- Leetcode Spiral Matrix IILeetCode
- Leetcode Path Sum IILeetCode
- Leetcode-Subsets IILeetCode
- Leetcode-Permutations IILeetCode