题目
- 现在你总共有 n 门课需要选,记为 0 到 n-1。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。
可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
思路
同Task29
public class Solution
{
public int[] FindOrder(int numCourses, int[][] prerequisites)
{
int[] res = new int[numCourses];
LinkedList<int>[] list = new LinkedList<int>[numCourses];
for (int i = 0; i < list.Length; i++)
{
list[i] = new LinkedList<int>();
}
int[] count = new int[numCourses];
foreach (var item in prerequisites)
{
list[item[1]].AddLast(item[0]);
count[item[0]]++;
}
Queue<int> queue = new Queue<int>();
for (int i = 0; i < numCourses; i++)
{
if (count[i] == 0)
queue.Enqueue(i);
}
int k = 0;
while (queue.Count > 0)
{
int j = queue.Dequeue();
res[k++] = j;
LinkedListNode<int> p = list[j].First;
while (p != null)
{
count[p.Value]--;
if (count[p.Value] == 0)
queue.Enqueue(p.Value);
p = p.Next;
}
}
bool flag = false;
foreach (var item in count)
{
if (item != 0)
{
flag = true;
break;
}
}
return flag == true ? new int[0] : res;
}
}