Leetcode 207. 课程表(DAY 92) ---- Leetcote Hot 100


原题题目


在这里插入图片描述


代码实现(首刷自解)


class Solution {
public:
    bool dfs(int pos,vector<int>& visit,vector<unordered_set<int>>& m)
    {
        if(visit[pos] == 2) return false;
        if(visit[pos] == 1) return true;
        visit[pos] = 1;
        for(const auto& c:m[pos])
        {
            if(visit[c]!=2)
                if(dfs(c,visit,m)) return true;
        }
        visit[pos] = 2;
        return false;
    }

    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<unordered_set<int>> m(numCourses);
        for(const auto& c:prerequisites)
            m[c[0]].emplace(c[1]);
        vector<int> visit(numCourses);
        for(int i=0;i<numCourses;++i)
        {
            if(m[i].size() && visit[i] != 2)
                if(dfs(i,visit,m)) return false;
        }
        return true;
    }
};

代码实现(二刷自解 DAY 154 C++)


class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        int learned_courses = 0;
        vector<int> ready,next;
        unordered_map<int,int> indegree;
        for(int i=0;i<numCourses;++i)   indegree[i] = 0;
        unordered_map<int,vector<int>> outdegree;
        for(const auto& pair:prerequisites)
        {
            outdegree[pair[1]].emplace_back(pair[0]);
            indegree[pair[0]]++;
        }

        for(const auto& node:indegree)
            if(!node.second)    ready.emplace_back(node.first);

        while(!ready.empty())
        {
            next.clear();
            for(const auto& num:ready)
            {
                ++learned_courses;
                for(const auto& index:outdegree[num])
                {
                    --indegree[index];
                    if(!indegree[index])    next.emplace_back(index);
                }
            }
            ready = next;
        }
        return learned_courses == numCourses;
    }
};

代码实现(三刷自解 DAY 13 golang)


func canFinish(numCourses int, prerequisites [][]int) bool {
  outdegree := make(map[int]map[int]struct{})
  indegree := make(map[int]int)
  var nowturn []int

  for i := 0; i < numCourses; i++ {
    outdegree[i] = make(map[int]struct{})
  }

  for _, coursepair := range prerequisites {
    outdegree[coursepair[1]][coursepair[0]] = struct{}{}
    indegree[coursepair[0]]++
  }

  for i := 0; i < numCourses; i++ {
    if indegree[i] == 0 {
      nowturn = append(nowturn, i)
    }
  }

  outnums := 0
  for len(nowturn) != 0 {
    nowsize := len(nowturn)
    for _, course := range nowturn {
      for outcourse, _ := range outdegree[course] {
        indegree[outcourse]--
        if indegree[outcourse] == 0 {
          nowturn = append(nowturn, outcourse)
        }
      }
    }
    nowturn = nowturn[nowsize:]
    outnums += nowsize
  }

  return outnums == numCourses
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值