课程表2
解题思路:
和课程表1的思路一模一样,只是加个返回数组。我这是用链表,每次从队列中弹出数时就加入链表中,最后返回之前先判断是否可以学完,再返回。
代码:
public int[] FindOrder(int numCourses, int[][] prerequisites)
{
List<int> lgx=new List<int>();//多了个返回数组。
if(prerequisites.Length==0)
{
for(int i=0;i<numCourses;i++)
{
lgx.Add(i);
}
return lgx.ToArray();
}
int a=numCourses;
int []rudu=new int[numCourses];//每个课程的入度。
for(int i=0;i<prerequisites.GetLength(0);i++)
{
rudu[prerequisites[i][0]]++;
}
List<int>[] result = Enumerable.Range(0, numCourses).Select(c => new List<int>()).ToArray();
foreach(var item in prerequisites)
{
result[item[1]].Add(item[0]);
}
Queue<int> queue=new Queue<int>();
for(int i=0;i<a;i++)
{
if(rudu[i]==0)
{
queue.Enqueue(i);
numCourses--;
}
}
while(queue.Count!=0)
{
int temp=queue.Dequeue();
lgx.Add(temp);//每次弹出时即说明可以学,就加入链表中。
foreach(var item in result[temp])
{
rudu[item]--;
if(rudu[item]==0)
{
queue.Enqueue(item);
numCourses--;
}
}
}
if(numCourses==0)
return lgx.ToArray();
else
{
int[] b=new int[0];
return b;
}
}