課程表 拓撲排序

2021-10-11 15:55:12 字數 4569 閱讀 7624

課程表

你這個學期必須選修numcourse門課程,記為0numcourse-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 門課需要選,記為0n-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,...