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

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

今天是课程表系列题目的最后一题,因为我在题库里找不到课程表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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值