leetcode 207. 课程表

7 篇文章 0 订阅
2 篇文章 0 订阅

题目: 207. 课程表

思路:

  • 深搜:判断是否有环。每个节点有三种状态,未访问0,正在访问1,已经访问2.深搜过程中,第一次遇到该节点,把状态置为1;若本次深搜再次遇到状态为1的,说明有环,结束;若某个节点往下已经搜索完了都没有环,就把状态置为2,表示已经访问结束.

  • 广搜:需要给每个节点建立一个入度表,表示有多少个节点指向本节点.建立一个队列,首先把入度为0的节点入队列,然后若队列不为空,则弹出队头元素,更新入度表,把队头元素指向的节点的入度减一,此时如果有节点入度变为1,就加入队列.根据这个算法,如果没有环,所有的节点都会入出队列一次,所以统计一下出入队列的节点数即可判断是否有环.

代码:dfs

class Solution {
    int[] visited;
    boolean res = true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        Set<Integer> sum = new HashSet<>();
        Map<Integer, List<Integer>> map = new HashMap<>();

        for (int i = 0; i < prerequisites.length; i ++) {
            int curNum = prerequisites[i][0];
            int preNum = prerequisites[i][1];
            sum.add(curNum);
            sum.add(preNum);
            if (!map.containsKey(curNum)) {
                map.put(curNum, new LinkedList<>());
            }
            map.get(curNum).add(preNum);
        }
        if (sum.size() > numCourses) {
            return false;
        }
        visited = new int[numCourses];
        for (Integer key: map.keySet()) {
            if (visited[key] == 0) {
                dfs(map, key);
            }
        }
        return res;
        
    }
    public void dfs(Map<Integer, List<Integer>> map, int start) {
        visited[start] = 1;
        if (!map.containsKey(start)) {
            visited[start] = 2;
            return;
        }
        for (Integer i : map.get(start)) {
            if (visited[i] == 1) {
                res = false;
                return;
            }
            if (!res) {
                return;
            }
            if (visited[i] == 0) {
                dfs(map, i);
            }
        }
        visited[start] = 2;
    }
}

代码:bfs

class Solution {
    int[] visited;
    boolean res = true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] table = new int[numCourses];
        Map<Integer, List<Integer>> adj = new HashMap<>();
        for (int i = 0; i < numCourses; i ++) {
            adj.put(i, new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i ++) {
            int pre = prerequisites[i][0];
            int next = prerequisites[i][1];
            adj.get(pre).add(next);
            table[next] += 1;
        }

        Queue<Integer> queue = new LinkedList<>();

        for (int i = 0; i < numCourses; i ++) {
            if (table[i] == 0) {
                queue.add(i);
            }
        }

        while (!queue.isEmpty()) {
            int cur = queue.poll();
            numCourses --;
            for (Integer num : adj.get(cur)) {
                table[num] --;
                if (table[num] == 0) {
                    queue.add(num);
                }
            }
        }
        return numCourses == 0;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值