Leetcode 207. 课程表

文章目录

  • 题目
  • 代码(首刷看解析)
  • 代码(10.1 二刷看解析)

题目

Leetcode 207. 课程表_第1张图片
Leetcode 207. 课程表

代码(首刷看解析)

class Solution {
public:
    bool hasCycle;  // 有没有环
    vector<bool> onPath;    // 记录一次traverse递归经过的结点(回溯)
    vector<bool> visited;   // 记录遍历过的结点,避免重复计算
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        auto map = build(numCourses, prerequisites);
        visited.resize(numCourses, false);
        onPath.resize(numCourses, false);
        for(int i = 0; i < numCourses; i++) {
            traverse(map, i);   // 保证从每一个结点开始都没有环
        }
        return !hasCycle;
    }
    void traverse(vector<vector<int>>& graph, int s) {// s代表指向的结点
        if(onPath[s]) 
            hasCycle = true;
        if(visited[s] || hasCycle)
            return;
        visited[s] = true;  // 该结点已经访问过
        onPath[s] = true;
        for(int t : graph[s]) {
            traverse(graph, t);
        }
        onPath[s] = false;  // 回溯
    }

    vector<vector<int>> build(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> map(numCourses);
        for(auto& edge : prerequisites) {
            map[edge[1]].push_back(edge[0]);
        }
        return map;
    }
};

代码(10.1 二刷看解析)

class Solution {
public:
    vector<vector<int>> edges;
    vector<int> indeg;
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        edges.resize(numCourses);
        indeg.resize(numCourses);
        for(auto& info : prerequisites) {
            edges[info[1]].push_back(info[0]);
            indeg[info[0]]++;   // 入度
        }
        queue<int> q;
        for(int i = 0; i < numCourses; i++) {
            if(indeg[i] == 0) {
                q.push(i);
            }
        }
        int visited = 0;
        while(!q.empty()) {
            visited++;  // 说明有一个节点入度为0了,+1,只有最后所有节点的入度都为0了,才能说明没有环
            int u = q.front();
            q.pop();
            for(int v : edges[u]) {
                indeg[v]--;
                if(indeg[v] == 0) 
                    q.push(v);
            }
        }
        return visited == numCourses;
    }
};

你可能感兴趣的:(Leetcode专栏,leetcode,算法,职场和发展)