• [LeetCode] 207. Course Schedule 课程表


    题目:


     分析:

    这是一道典型的拓扑排序问题。那么何为拓扑排序?

    拓扑排序:

    有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A>C>B。

    总的来说,拓扑排序就是对于相互之间有先后依赖关系的事件,给出一个行之有效的序列。

    图解释:

    反应到图中,就是一个有向无环图可以被拓扑排序,而有环图是无法进行拓扑排序的(比如,A依赖B,B依赖C,C依赖A,三者形成了环,是没有办法完成的)


     很明显“课程表”这个题目就是判断题目所给的依赖关系,是否可以进行拓扑排序,或是否是有向无环图

    思路:

    对于拓扑排序,一般有两种方法进行判断:

    1、深度优先搜索(DFS),判断是否有环

    2、节点的入度,一个节点的入度是指向指向该节点的节点个数,比如拓扑排序举的例子,A的入度为0,BC的入度均为1

    这里利用节点的入度来判断是否可以进行拓扑排序,或者是否是有向无环图

    只要某个节点的入度为0,就说明其没有依赖条件,可以直接输出,同时减少以该节点为起点的节点的入度

    回到题目

    题目已知,n个课程会被从0至n-1编号

    我们需要知道每个课程的入度,可以定义一个preNum数组, preNum[i]:代表i号课程所依赖的课程数

    同时在寻找0入度的课程时,我们需要知道某个课程是否已上完,可以定义一个visited数组,visited[i]:表示i号课程已上完

    为了寻找0入度课程方便,构造一个getNext()函数,用来寻找入度为0的课程

    代码: 

    class Solution {
    public:
        int getNext(vector<int> preNum, vector<int> visited){
            for(int i=0; i<preNum.size(); i++)  if(!visited[i] && !preNum[i])   return i;
            return -1;
        }
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {int n = prerequisites.size();
            vector<int> visited(numCourses);
            vector<int> preNum(numCourses);
            for(int i=0; i<n; i++)  preNum[prerequisites[i][0]]++;
            for(int i=getNext(preNum, visited); i!=-1; i=getNext(preNum, visited)){
                visited[i] = 1;
                numCourses--;
                for(int j=0; j<n; j++){
                    if(prerequisites[j][1]==i)  preNum[prerequisites[j][0]]--;
                }
                if(!numCourses) return true; 
            }
            return false;
        }
    };

    当然,这段程序还有改进的余地,比如说获取下一个0入度的课程的方式,每次都利用了循环

    可以动态维护一个栈,每当某个课程的入度为零时即压入栈,以此来节省时间,有兴趣的同学可以自己写一下

    我做了一下测试,运行时间没有明显减少,反而是内存消耗降低了,应该是调用函数的次数减少,减少了内存的使用

  • 相关阅读:
    Safari书签同步
    光标从编辑器移入本页面中的其它输入域后,IE中每次只在编辑器首部插入内容
    JavaScript里模拟sleep
    外观/门面模式(Facade)
    JavaScript中delete操作符不能删除的对象
    Perl与JS的比较(子程序)
    读jQuery之二十一(队列queue)
    JavaScript中“基本类型”之争
    读jQuery之十九(多用途回调函数列表对象)
    工厂模式(Factory)
  • 原文地址:https://www.cnblogs.com/ech2o/p/12396054.html
Copyright © 2020-2023  润新知