目录
今天是课程表系列题目的最后一题,因为我在题库里找不到课程表5了,所以今天的每日一题就是最后一个课程表了。
题目照例是给我们一堆课程的先修关系,然后问我们某课程是否是另一个课程的先修课程,或者是先修课程的先修课程。
如下图,B,C,D都是A的先修课程。
把问题换个问法,也就是在有向图中,一个节点能否走到另一个节点。
那我们只需要递归的去寻找目标课程的先修课程,直到找到对应的先修课程或者是把所有先修课程都找遍了也没找到。
DFS和BFS都可以,我个人喜欢DFS,所以下面代码是DFS的。
- class Solution {
- public:
- unordered_map<int,vector<int>>m;
- bool find(int n,int cur,int target,unordered_set<int>& 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<bool> checkIfPrerequisite(int numCourses, vector
int >>& prerequisites, vectorint >>& queries) { - for(auto& p:prerequisites){ //构建有向图
- if(m.find(p[0])==m.end()) m[p[0]]=vector<int>(0);
- m[p[0]].push_back(p[1]);
- }
- vector<bool>res;
- for(auto& q:queries){ //遍历问题
- unordered_set<int>s;
- if(find(numCourses,q[0],q[1],s)) res.push_back(true);
- else res.push_back(false);
- }
- return res;
- }
- };