leecode_210 Course Schedule II

原创 2016年05月31日 04:05:20

There are a total of n courses you have to take, labeled from 0 to n - 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 prerequisite pairs, 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].

想法是先找能修的课(没有要求基础的课),都修了,然后看他们的son,能不能修,能修就丢进queue。

观察那个队列,如果最后队列为空,能修的课的数目小于要求的数目的话,就算规划失败。

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        
        vector<vector<int>> pre_course;
        vector<vector<int>> next_course;
        vector<int>temp;
        unordered_set<int> set;
        queue<int>  que;
        vector<int> res;
        
        for (int i=0;i<numCourses;i++){
            //next_temp.push_back(temp);
            pre_course.push_back(temp);
            next_course.push_back(temp);
        }
        
        for (int i=0;i<prerequisites.size();i++){
            int from=prerequisites[i].second;
            int to=prerequisites[i].first;
            pre_course[to].push_back(from);
            next_course[from].push_back(to);
        }
        
        for (int i=0;i<numCourses;i++){
            if (pre_course[i].size()==0)
                que.push(i);
            
        }
        
        while(!que.empty()){
            int course_taking=que.front();
            que.pop();
            
            if (set.find(course_taking)==set.end()) {
                  set.insert(course_taking);
                  res.push_back(course_taking);
                  bool all_pre_ok=true;
            
                  for (int i=0;i<next_course[course_taking].size();i++){
                          int next_cour=next_course[course_taking][i];
                          for (int j=0;j<pre_course[next_cour ].size();j++){
                                    if (set.find( pre_course[ next_cour ][j] ) == set.end())
                                              all_pre_ok=false;
                                    
                           }
                  
                         if (all_pre_ok) 
                              que.push(next_course[course_taking][i]);
                              
                         all_pre_ok=true; 
                   }
            
            }
        }
        
        if (res.size()<numCourses)
             res.clear();
        return res;
    }
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

5道较难的数据库查询习题(Intermediate SQL)

习题之前,我们先建立了11张表: create table classroom (building varchar(15), room_number varcha...
  • u010983710
  • u010983710
  • 2013年10月26日 10:04
  • 3991

《JAVA继承与多态》改写程序清单10-6中的Course类,编写一个测试类测试所有的方法

JAVA实验《继承与多态》【课程类Course】改写程序清单10-6中的Course类。 使用ArrayList代替数组来存储学生。不应该改变Course类的原始合约(即不要改变构造方法和方法的方法头...
  • morethansea
  • morethansea
  • 2016年05月12日 17:28
  • 2886

LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)

求有向图中是否有环。 法一:拓扑排序 用一个队列维护所有入度为0的节点,每次弹出一个节点v,查看从v可达的所有节点u; 将u的入读减一,若u的入度此时为0, 则将u加入队列。 在队列为空时,检查所有...
  • u014674776
  • u014674776
  • 2015年07月27日 17:10
  • 1772

No210. Course Schedule II

一、题目描述 There are a total of n courses you have to take, labeled from 0 to n - 1. Some cour...
  • qiaosen20
  • qiaosen20
  • 2017年05月26日 22:29
  • 82

LeetCode 210. Course Schedule II(课程安排)

原题网址:https://leetcode.com/problems/course-schedule-ii/ There are a total of n courses you have ...
  • jmspan
  • jmspan
  • 2016年05月04日 17:09
  • 397

LeetCode 210. Course Schedule II|图问题.拓扑排序

题目描述There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have p...
  • tbsjianjian
  • tbsjianjian
  • 2016年11月14日 10:39
  • 244

LeetCode 210 Course Schedule II

题目描述There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have p...
  • Yano_nankai
  • Yano_nankai
  • 2015年12月08日 10:22
  • 1353

leetcode - 210. Course Schedule II

算法系列博客之拓扑排序 DFS和入度数组
  • Quiteen
  • Quiteen
  • 2017年03月26日 13:17
  • 209

Leetcode 210. Course Schedule II

There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have prere...
  • xinqrs01
  • xinqrs01
  • 2017年02月10日 04:37
  • 132

LeetCode Algorithms 210. Course Schedule II

题目难度: Medium 原题描述: There are a total of n courses you have to take, labeled from 0 t...
  • u010985058
  • u010985058
  • 2017年06月25日 23:02
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leecode_210 Course Schedule II
举报原因:
原因补充:

(最多只允许输入30个字)