22. Course Schedule II

Link to the problem

Description

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.

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].

Idea

Run a DFS and push finished nodes to a vector.

Solution

class Solution {
private:
    bool dfs(int v, unordered_map<int, vector<int> > &graph, unordered_set<int> &visited,
            unordered_set<int> &finished, vector<int> &output) {
        if (finished.find(v) != finished.end()) return true;
        if (visited.find(v) != visited.end()) return false;
        visited.insert(v);
        for (auto &nbr : graph[v]) {
            if (!dfs(nbr, graph, visited, finished, output)) {
                return false;
            }
        }
        visited.erase(v);
        finished.insert(v);
        output.push_back(v);
        return true;
    }
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int> > &prerequisites) {
        unordered_map<int, vector<int> > graph;
        for (auto &prereq : prerequisites) {
            graph[prereq.first].push_back(prereq.second);
        }
        vector<int> rtn;
        unordered_set<int> visited, finished;
        for (int i = 0; i < numCourses; ++i) {
            if (!dfs(i, graph, visited, finished, rtn)) return vector<int> {};
        }
        return rtn;
    }
};

44 / 44 test cases passed.
Runtime: 21 ms

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 13,493评论 0 23
  • 一夜无眠的江小寒,翻来覆去都睡不着,然后在第二天就一觉睡到了下午三点才懒洋洋地自然醒。 下午茶时间,楼下的甜品店又...
    任墨阅读 3,749评论 0 1
  • 山药是人们所熟悉的一种炖汤用料,它的别名叫怀山药,因山药的产地甚广,而地处焦作的质地最好。山药连着一个药字,很多人...
    海绵bo宝阅读 3,315评论 0 0

友情链接更多精彩内容