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 207 Course ScheduleLeetCode
- 207. Course Schedule
- [LeetCode] 212. Word Search IILeetCode
- LeetCode 59. 螺旋矩陣 II(python、c++)LeetCode矩陣PythonC++
- Leetcode Word SearchLeetCode
- LeetCode C++ 441. Arranging Coins【Math/Binary Search】簡單LeetCodeC++
- LeetCode—253.會議室 II(Meeting Rooms II)——分析及程式碼(C++)LeetCodeOOMC++
- LeetCode C++ 33. Search in Rotated Sorted Array【二分】中等LeetCodeC++
- 【LeetCode】253. Meeting Rooms II 解題報告(C++)LeetCodeOOMC++
- 240. Search a 2D Matrix II
- Leetcode 35 Search Insert PositionLeetCode
- Leetcode 33 Search in Rotated Sorted ArrayLeetCode
- LeetCode 35. Search Insert PositionLeetCode
- leetcode-90. Subsets IILeetCode
- Leetcode 40 Combination Sum IILeetCode
- Leetcode 213 House Robber IILeetCode
- LeetCode 1103[分糖果II]LeetCode
- LeetCode刷題記錄與題解(C++版本)LeetCodeC++
- LeetCode 98. Validate Binary Search TreeLeetCode
- LeetCode之Increasing Order Search Tree(Kotlin)LeetCodeKotlin
- [LeetCode] 305. Number of Islands IILeetCode
- [Leetcode]253. Meeting Rooms IILeetCodeOOM
- [LeetCode] 2105. Watering Plants IILeetCode
- LeetCode 52. N皇后 IILeetCode
- [leetcode]linked-list-cycle-iiLeetCode
- leetcode 219. Contains Duplicate IILeetCodeAI
- [LeetCode] 910. Smallest Range IILeetCode
- [LeetCode] 45. Jump Game IILeetCodeGAM
- LeetCode-047-全排列 IILeetCode
- Leetcode 137. Single Number IILeetCode
- [LeetCode] 3152. Special Array IILeetCode
- [LeetCode] 501. Find Mode in Binary Search TreeLeetCode
- [LeetCode] 702. Search in a Sorted Array of Unknown SizeLeetCode
- [leetcode]convert-sorted-array-to-binary-search-treeLeetCode
- LeetCode 501. Find Mode in Binary Search TreeLeetCode
- LeetCode 1305 All Elements in Two Binary Search TreesLeetCode