【力扣每日一题】2023.9.12 课程表Ⅳ

目录

题目:

示例:

分析:

代码:


题目:

【力扣每日一题】2023.9.12 课程表Ⅳ_第1张图片

示例:

【力扣每日一题】2023.9.12 课程表Ⅳ_第2张图片

分析:

今天是课程表系列题目的最后一题,因为我在题库里找不到课程表5了,所以今天的每日一题就是最后一个课程表了。

题目照例是给我们一堆课程的先修关系,然后问我们某课程是否是另一个课程的先修课程,或者是先修课程的先修课程。

如下图,B,C,D都是A的先修课程。

【力扣每日一题】2023.9.12 课程表Ⅳ_第3张图片

把问题换个问法,也就是在有向图中,一个节点能否走到另一个节点。

那我们只需要递归的去寻找目标课程的先修课程,直到找到对应的先修课程或者是把所有先修课程都找遍了也没找到。

DFS和BFS都可以,我个人喜欢DFS,所以下面代码是DFS的。

代码:

class Solution {
public:
    unordered_map>m;
    bool find(int n,int cur,int target,unordered_set& s){
        if(s.count(cur)) return false;  //防止重复递归同一个课程
        s.insert(cur);
        for(int& i:m[cur]){         //遍历当前课程的先修课程
            if(i==target) return true;  //如果等于了目标课程那么返回ture
            if(find(n,i,target,s)) return true; //再去寻找先修课程的先修课程
        }
        return false;
    }
    vector checkIfPrerequisite(int numCourses, vector>& prerequisites, vector>& queries) {
        for(auto& p:prerequisites){ //构建有向图
            if(m.find(p[0])==m.end()) m[p[0]]=vector(0);
            m[p[0]].push_back(p[1]);
        }
        vectorres;
        for(auto& q:queries){   //遍历问题
            unordered_sets;
            if(find(numCourses,q[0],q[1],s)) res.push_back(true);
            else res.push_back(false);
        }
        return res;
    }
};

你可能感兴趣的:(力扣每日一题,leetcode,算法,c++,数据结构)