查看: 1632| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

207. Course Schedule看不懂这个解法求大神解说

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
public boolean canFinish(int numCourses, int[][] prerequisites) {
    int[][] matrix = new int[numCourses][numCourses]
    int[] indegree = new int[numCourses];

    for (int i=0; i<prerequisites.length; i++) {
        int ready = prerequisites[i][0];
        int pre = prerequisites[i][1];
//这里不太明白
        if (matrix[pre][ready] == 0)
            indegree[ready]++
        matrix[pre][ready] = 1;
    }

    int count = 0;
    Queue<Integer> queue = new LinkedList();
    for (int i=0; i<indegree.length; i++) {
        if (indegree[i] == 0) queue.offer(i);
    }
    while (!queue.isEmpty()) {
        int course = queue.poll();
        count++;
        for (int i=0; i<numCourses; i++) {
            if (matrix[course][i] != 0) {
                if (--indegree[i] == 0)
                    queue.offer(i);
            }
        }
    }
    return count == numCourses;
}



补充内容 (2018-7-15 04:51):
   for (int i=0; i<numCourses; i++) {
            if (matrix[course] != 0) {
为什么这里i的范围小于numCourses

上一篇:偏数学类的题会考么
下一篇:Machine learning刷题
全局:
这网站上贴 【i】的时候会变成斜体, 然后i也不见了,所以你这个代码不是特别确定到底长什么样。

建议用 gist.github 贴, 方便无公害。

我大概猜一下你的问题。。

首先说他这个方法。 这是bfs做拓扑排序方法, 卡恩方法(kahn's method)。

这个方法原理是说如果任何一个node 的in degree是0,说明他是头。 所以q里面放的就是头。
从头往外的每一个点, 都把头(上一轮)去掉之后,那现在in degree又变成0的话, 说明只能从头进这个点, 那这个点就是下一个头。

举例, 1-2-3-5  2- 4-5. 那么1显然是头。1 去掉之后, 2即头。 2去掉, 3,4均是头。3,4,去掉,5为头。解释的不是特别好, 但我想你大概理解什么意思。。

现在说代码。他这里 indegree[pre][ready] ==0 就是说不想重复计算从pre进入ready的in degree。 因为[pre][ready]如果已经看到过的话 (==1)那么这个in degree不应该再算。

你第二问应该是 if(matrix[courses][j] != 0), 然后 indegree[j]-- 这里是说从你当前的course (头)出来去别的课的indegree 都减1,。如果in degree变0了, 说明这个课变头了。。

这里 j 小于numcourses是因为用的是adj matrix 形式存储, 他不知道从course 到另外哪些课程有没有记录, 所以得全试一遍。

当然你可以不这样记录, 因为假如有6MM课, 但是中间的关系很少的话那matrix就没什么用。。

大概这样。。 o( ̄ヘ ̄o#)
回复

使用道具 举报

🔗
sicilianee 2018-7-18 14:15:46 | 只看该作者
全局:
the edge is from pre to ready, so degree[ready]++
输入的边如果没有重复复的话, 感觉这个if判断没啥必要,直接++就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表