zoukankan      html  css  js  c++  java
  • Leetcode** 207. Course Schedule

    Description: There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] = [ai, bi] indicates that you must take course bi first if you want to take course ai.

    • For example, the pair [0, 1], indicates that to take course 0 you have to first take course 1.

    Return true if you can finish all courses. Otherwise, return false.

    Link: 207. Course Schedule

    Examples:

    Example 1:
    Input: numCourses = 2, prerequisites = [[1,0]]
    Output: true
    Explanation: There are a total of 2 courses to take. 
    To take course 1 you should have finished course 0. So it is possible.
    
    Example 2:
    Input: numCourses = 2, prerequisites = [[1,0],[0,1]]
    Output: false
    Explanation: There are a total of 2 courses to take. 
    To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. 
    So it is impossible.

    思路: 第一步就是知道每门课的先修课列表,如果每门课都能顺利修成,就返回True,否则就是False。什么情况这门课可以修成?什么情况不能,例子2已经给出了不能的实例,就是正在修课程A,课程A需要先完成课程B,课程B需要修课程A,这样就冲突了。落实到DFS上,我们需要借助一个状态表,记录每个课程的状态,初始状态用0表示,修完了用1表示,正在修这门课,用2表示。定义dfs()函数的功能是,课程a是否能顺利修完,进入这个函数,a的状态是正在修,然后查看a的先修课,如果所有先修课可以顺利,则a的状态是修完,同时返回True,如果在遍历先修课时,再次遍历到a,如果a的状态是1,修完,则返回True,如果是正在修,说明冲突了,返回False.

    class Solution(object):
        def canFinish(self, numCourses, prerequisites):
            """
            :type numCourses: int
            :type prerequisites: List[List[int]]
            :rtype: bool
            """
            self.pre = collections.defaultdict(list)
            for p in prerequisites:
                self.pre[p[0]].append(p[1])
            # 0 unvisit, 1 visited and 2 visiting
            self.visited = [0] * numCourses
            for i in range(numCourses):
                if not self.dfs(i):
                    return False
            return True
        
        # dfs represent, can finish course a? if yes, return True otherwise False
        def dfs(self, a):
            if self.visited[a] == 1: return True
            if self.visited[a] == 2: return False
            self.visited[a] = 2
            for b in self.pre[a]:
                if not self.dfs(b): return False
            self.visited[a] = 1
            return True

    日期: 2021-04-20  天气突然就变暖了

  • 相关阅读:
    servlet技术学习随笔
    python使用openpyxl读取excel文件
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读提问-2
    课后作业-阅读任务-阅读笔记3
    构建之法:现代软件工程-阅读笔记2
    《构建之法:现代软件工程-阅读笔记》
    结对编程需求分析
    团队-团队编程项目作业名称-需求分析
    团队-团队编程项目作业名称-成员简介及分工
  • 原文地址:https://www.cnblogs.com/wangyuxia/p/14680600.html
Copyright © 2011-2022 走看看