207.课程表
Python
207
入度+邻接矩阵!!!
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
indegrees = [0] * numCourses
adjacency = [[] for _ in range(numCourses)]
for item in prerequisites:
indegrees[item[0]] += 1 # 每个点的入度统计
adjacency[item[1]].append(item[0]) # 起点 => [终点]
q = collections.deque()
for i in range(numCourses):
if indegrees[i] == 0:
q.append(i)
visited = 0
while len(q) > 0:
cur_node = q.popleft()
visited += 1
for end_node in adjacency[cur_node]:
indegrees[end_node] -= 1
if indegrees[end_node] == 0:
q.append(end_node)
return visited == numCourses
210
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
res = list()
q = collections.deque()
indegrees = [0] * numCourses
adajcency = [[] for _ in range(numCourses)]
for tmp_array in prerequisites:
indegrees[tmp_array[0]] += 1
adajcency[tmp_array[1]].append(tmp_array[0])
for i in range(numCourses):
if indegrees[i] == 0:
q.append(i)
while len(q) > 0:
top = q.popleft()
res.append(top)
for tmp in adajcency[top]:
indegrees[tmp] -= 1
if indegrees[tmp] == 0:
q.append(tmp)
return res if len(res) == numCourses else []
Java
法1:DFS
很容易理解的方法!
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] flags = new int[numCourses];
List<List<Integer>> adjacency = new ArrayList<>();
for (int i = 0; i < numCourses; ++i) {
adjacency.add(new ArrayList<>());
}
for (int[] array : prerequisites) {
adjacency.get(array[1]).add(array[0]);
}
for (int i = 0; i < numCourses; ++i) {
if (!dfs(adjacency, flags, i)) {
return false;
}
}
return true;
}
// 无环图 => true; 有环图 => false
public boolean dfs(List<List<Integer>> adjacency, int[] flags, int index) {
if (flags[index] == 1) {
return false;
} else if (flags[index] == -1) {
return true;
}
flags[index] = 1;
for (int nextInx : adjacency.get(index)) {
if (!dfs(adjacency, flags, nextInx)) {
return false;
}
}
flags[index] = -1;
return true;
}
}
法2:入度表(BFS)
复习入度和出度的概念!
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int visited = 0;
int[] indegrees = new int[numCourses];
Queue<Integer> queue = new LinkedList<>();
List<List<Integer>> adjacency = new ArrayList<>();
for (int i = 0; i < numCourses; ++i) {
adjacency.add(new ArrayList<>());
}
for (int[] array : prerequisites) {
++indegrees[array[0]];
adjacency.get(array[1]).add(array[0]);
}
for (int i = 0; i < numCourses; ++i) {
if (indegrees[i] == 0) {
queue.offer(i);
}
}
while (!queue.isEmpty()) {
int topInx = queue.poll();
++visited;
for (int k : adjacency.get(topInx)) {
--indegrees[k];
if (indegrees[k] == 0) {
queue.offer(k);
}
}
}
return visited == numCourses;
}
}
210.课程表II
法1:入度表(BFS)
BFS更简单实现!!!
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
List<Integer> res = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();
int[] indegrees = new int[numCourses];
List<List<Integer>> adjacency = new ArrayList<>();
for (int i = 0; i < numCourses; ++i) {
adjacency.add(new ArrayList<>());
}
for (int[] arr : prerequisites) {
++indegrees[arr[0]];
adjacency.get(arr[1]).add(arr[0]);
}
for (int i = 0; i < numCourses; ++i) {
if (indegrees[i] == 0) {
queue.offer(i);
}
}
while (!queue.isEmpty()) {
int topInx = queue.poll();
res.add(topInx);
for (int k : adjacency.get(topInx)) {
--indegrees[k];
if (indegrees[k] == 0) {
queue.offer(k);
}
}
}
if (res.size() == numCourses) {
int[] resArray = new int[numCourses];
for (int i = 0; i < res.size(); ++i) {
resArray[i] = res.get(i);
}
return resArray;
}
return new int[0];
}
}