目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
今天是课程表系列题目的最后一题,因为我在题库里找不到课程表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<vector<int>>& prerequisites, vector<vector<int>>& 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;
}
};