leetcode 207. Course Schedule | 207. 课程表(Java)

一时失言乱红尘 2022-10-05 12:57 252阅读 0赞

题目

https://leetcode.com/problems/course-schedule/
在这里插入图片描述

题解

这的道题思路,来源于数据结构中的 拓扑排序 问题,主要思路是,通过逐步遍历删除入度为 0 的节点,判断该图是否一个有向无环图(DAG)。即,判断该图是否满足两个条件:

  1. 必须能够连通所有节点 (分析本题场景发现,可以不经过所有节点)
  2. 不能有环

详细解题思路见下图:
在这里插入图片描述

  1. import java.util.ArrayList;
  2. class Node {
  3. int inDegree;
  4. ArrayList<Integer> children;
  5. boolean alive; // whether deleted
  6. public Node() {
  7. alive = true;
  8. children = new ArrayList<>();
  9. }
  10. }
  11. class Solution {
  12. public boolean canFinish(int numCourses, int[][] prerequisites) {
  13. // init courses
  14. Node[] nodes = new Node[numCourses];
  15. for (int i = 0; i < numCourses; i++) {
  16. nodes[i] = new Node();
  17. }
  18. // init prerequisites
  19. for (int i = 0; i < prerequisites.length; i++) {
  20. nodes[prerequisites[i][0]].children.add(prerequisites[i][1]);
  21. nodes[prerequisites[i][1]].inDegree++;
  22. }
  23. // check DAG
  24. int remain = numCourses; // remaining nodes
  25. boolean valid = true; // last loop really works
  26. while (valid && remain > 0) {
  27. valid = false;
  28. for (int i = 0; i < numCourses; i++) {
  29. if (nodes[i].inDegree == 0 && nodes[i].alive) {
  30. for (int n : nodes[i].children) { // update
  31. nodes[n].inDegree--;
  32. }
  33. valid = true;
  34. nodes[i].alive = false;
  35. remain--;
  36. }
  37. }
  38. }
  39. return remain == 0;
  40. }
  41. }

每一次提交运行时间不一样,但总体来看效率比较低,后续看一下是否有优化解法。
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读