課程表
你這個學期必須選修numcourse
門課程,記為0
到numcourse-1
。
在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用乙個匹配來表示他們:[0,1]
給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?
示例 1:輸入:2, [[1,0]]輸出:true解釋:總共有 2 門課程。學習課程 1 之前,你需要完成課程 0。所以這是可能的。
示例 2:
輸入:2, [[1,0],[0,1]]輸出:false解釋:總共有 2 門課程。學習課程 1 之前,你需要先完成課程 0;並且學習課程 0 之前,你還應先完成課程 1。這是不可能的。課程安排圖是否是 有向無環圖(dag),通過 拓撲排序 判斷此課程安排圖是否是dag
方法一:入度表(bfs)
我的方法:基於陣列
public boolean canfinish(int numcourses, int prerequisites)
used[index] = true;
changedegree(index, prerequisites, degree);
list.add(index);
}return true;
}public static int initdegree(int numcourses,int prerequisites)
return degree;
}public static int finddegree0(int degree, boolean used)
}return -1;
}public static void changedegree(int index, int prerequisites, int degree)
}}
鄰接表
時間複雜度 o(n + m): 遍歷乙個圖需要訪問所有節點和所有臨邊,n 和 m分別為節點數量和臨邊數量;
空間複雜度 o(n + m): 為建立鄰接表所需額外空間
public boolean canfinish(int numcourses, int prerequisites)
int degree = initdegree(numcourses, prerequisites,lists);
queuequeue = new linkedlist();
initqueue(degree, queue);
int count = 0;
while (!queue.isempty())
return count == numcourses;
}//初始化入度
public static int initdegree(int numcourses, int prerequisites, list> lists)
return degree;
}public static void updatedegree(int index, int degree,list> lists)
}public static void initqueue(int degree, queuequeue)
}}public static void updatequeue(int degree, queuequeue, list> lists, int index)
}}
方法二:dfs
時間複雜度o(m+n)
空間複雜度o(m+n)
public boolean canfinish(int numcourses, int prerequisites)
}return true;
}//初始化鄰接表
public list> init(int numcourses, int prerequisites)
for (int i = 0; i < prerequisites.length; i++)
return lists;
}public boolean dfs(list> lists, int state, int pos)
if (state[pos] == 1)
state[pos] = -1;//標記為搜尋中
for (integer num : lists.get(pos))
}state[pos] = 1;
return true;
}
課程表 ii
現在你總共有 n 門課需要選,記為0
到n-1
。
在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用乙個匹配來表示他們:[0,1]
給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。
可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回乙個空陣列。
示例 1:
輸入:2, [[1,0]]輸出:[0,1]
解釋:總共有 2 門課程。要學習課程 1,你需要先完成課程 0。因此,正確的課程順序為 `[0,1] 。
示例 2:
輸入:4, [[1,0],[2,0],[3,1],[3,2]]輸出:[0,1,2,3] or [0,2,1,3]
解釋:總共有 4 門課程。要學習課程 3,你應該先完成課程 1 和課程 2。並且課程 1 和課程 2 都應該排在課程 0 之後。因此,乙個正確的課程順序是
[0,1,2,3]
。另乙個正確的排序是[0,2,1,3]
。
public int findorder(int numcourses, int prerequisites)
int degree = initdegree(numcourses, prerequisites,lists);
int ans=new int[numcourses];
queuequeue = new linkedlist();
initqueue(degree, queue);
int count = 0;
while (!queue.isempty())
return count == numcourses?ans:new int[0];
}//初始化入度
public static int initdegree(int numcourses, int prerequisites, list> lists)
return degree;
}public static void updatedegree(int index, int degree,list> lists)
}public static void initqueue(int degree, queuequeue)
}}public static void updatequeue(int degree, queuequeue, list> lists, int index)
}}
public int findorder(int numcourses, int prerequisites)
}int ans = new int[numcourses];
int i = 0;
while (!stack.isempty())
return ans;
}//初始化鄰接表
public list> init(int numcourses, int prerequisites)
for (int i = 0; i < prerequisites.length; i++)
return lists;
}public boolean dfs(list> lists, int state, int pos,stackstack)
if (state[pos] == 1)
state[pos] = -1;//標記為搜尋中
for (integer num : lists.get(pos))
}state[pos] = 1;
stack.push(pos);
return true;
}
lectcode 課程表 拓撲排序)
現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,判斷是否可能完成所有課程的學習?示例 1 輸入 2,1,0 輸出 true 解釋 總共有 2 門課程...
LeetCode 拓撲排序 207 課程表
難度中等 你這個學期必須選修 numcourse 門課程,記為 0 到 numcourse 1 在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?示例1 輸入 2,1...
《拓撲排序》207 課程表《leetcode》
難度中等656 你這個學期必須選修numcourse門課程,記為0到numcourse 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?示例 1 輸入 2,1,...