Course Schedule II

题目

There are a total ofncourses you have to take, labeled from0ton - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair:[0,1]

Given the total number of courses and a list of prerequisitepairs, return the ordering of courses you should take to finish all courses.

There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is[0,1]

4, [[1,0],[2,0],[3,1],[3,2]]

There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is[0,1,2,3]. Another correct ordering is[0,2,1,3].

思路分析

这道题跟course schedule I一样也是一道graph的题,考察点的是topological sort,可以使用BFS来实现,也可以通过DFS来实现

BFS实现

class Solution(object):
    def findOrder(self, numCourses, prerequisites):
        """
        :type numCourses: int
        :type prerequisites: List[List[int]]
        :rtype: List[int]
        """
        graphMap = {i: set() for i in xrange(numCourses)}
        indegree = {i: 0 for i in xrange(numCourses)}
        result = []
        for neighbor, course in prerequisites:
            graphMap[course].add(neighbor)
            indegree[neighbor] += 1
        queue = [course for course in indegree if indegree[course] == 0]
        while queue:
            course = queue.pop(0)
            result.append(course)
            for neighbor in graphMap[course]:
                indegree[neighbor] -= 1
                if indegree[neighbor] == 0: queue.append(neighbor)
        if len(result) == numCourses: return result
        return []

DFS实现

class Solution(object):
    def findOrder(self, numCourses, prerequisites):
        """
        :type numCourses: int
        :type prerequisites: List[List[int]]
        :rtype: List[int]
        """
        graphMap = {i: set() for i in xrange(numCourses)}
        result = []
        visited= [0 for i in xrange(numCourses)]
        for neighbor, course in prerequisites:
            graphMap[course].add(neighbor)
        for course in graphMap:
            if visited[course] == 0:
                if not self.dfs(graphMap, course, result, visited): return []
        return result[::-1]

    def dfs(self, graph, course, result, visited):
        if visited[course] == -1: return False
        if visited[course] == 1: return True
        visited[course] = -1
        for neighbor in graph[course]:
            if not self.dfs(graph, neighbor, result, visited): return False
        visited[course] = 1
        result.append(course)
        return True

results matching ""

    No results matching ""