Course Schedule ——LeetCode

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

题目大意:给一堆课程依赖,找出是否可以顺利修完全部课程,拓扑排序。

解法一:DFS+剪枝,DFS探测是否有环,图的表示采用矩阵。

    public boolean canFinish(int n, int[][] p) {
        if (p == null || p.length == 0) {
            return true;
        }
        int row = p.length;
        int[][] pre = new int[n][n];
        for (int i = 0; i < n; i++) {
            Arrays.fill(pre[i], -1);
        }
        for (int i = 0; i < row; i++) {
            pre[p[i][0]][p[i][1]] = p[i][1];
        }
//        System.out.println(Arrays.deepToString(pre));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j) {
                    continue;
                }
                if (pre[i][j] != -1) {
                    Deque<Integer> queue = new ArrayDeque<>();
                    queue.offer(pre[i][j]);
                    Set<Integer> circleDep = new HashSet<>();
                    circleDep.add(pre[i][j]);
                    while (!queue.isEmpty()) {
                        int dep = queue.poll();
                        if (dep >= row) {
                            continue;
                        }
                        for (int k = 0; k < n; k++) {
                            if (pre[dep][k] == -1) {
                                continue;
                            }
                            if (circleDep.contains(pre[dep][k])) {
                                return false;
                            }
                            queue.offer(pre[dep][k]);
                            circleDep.add(pre[dep][k]);
                            pre[dep][k]=-1;
                        }
                    }
                }
            }
        }
        return true;
    }

解法二:BFS,参考别人的思路,也是用矩阵表示图,另外用indegree表示入度,先把入度为0的加入队列,当队列非空,逐个取出队列中的元素,indegree[i]-1==0的继续入队列,BFS遍历整个图,用count记录课程数,如果等于给定值则返回true。

    public boolean canFinish(int n, int[][] p) {
        if (p == null || p.length == 0) {
            return true;
        }
        int[][] dep = new int[n][n];
        int[] indegree = new int[n];
        for(int i=0;i<p.length;i++){
            if(dep[p[i][0]][p[i][1]]==1){
                continue;
            }
            dep[p[i][0]][p[i][1]]=1;
            indegree[p[i][1]]++;
        }
        Deque<Integer> queue = new ArrayDeque<>();
        for(int i=0;i<n;i++){
            if(indegree[i]==0){
                queue.offer(i);
            }
        }
        int count = 0;
        while(!queue.isEmpty()){
            count++;
            int cos = queue.poll();
            for(int i=0;i<n;i++){
                if(dep[cos][i]!=0){
                    if(--indegree[i]==0){
                        queue.offer(i);
                    }
                }
            }
        }
        return count==n;
    }
时间: 2024-10-25 23:41:46

Course Schedule ——LeetCode的相关文章

Course Schedule -- leetcode

There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of courses and a l

Solution to LeetCode Problem Set

Here is my collection of solutions to leetcode problems. LeetCode - Course Schedule LeetCode - Reverse Linked List LeetCode - Isomorphic Strings LeetCode - Count Primes LeetCode - Remove Linked List Elements LeetCode - Happy Number LeetCode - Bitwise

LeetCode Course Schedule II

原题链接在这里:https://leetcode.com/problems/course-schedule-ii/ 是Course Schedule的进阶版题目.采用的是同一种方法,这里只需要返回一个结果,所以遍历过的节点放入array中即可. AC Java: 1 public class Solution { 2 public int[] findOrder(int numCourses, int[][] prerequisites) { 3 int [] res = new int[num

LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到,在for (auto p: prerequistites)中特判了输入中可能出现的平行边或自环. 代码: class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { // [0, {1, 2, 3}], me

【LeetCode】Course Schedule II 解题报告

[题目] There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of courses an

[LeetCode] Course Schedule II 课程清单之二

There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of courses and a l

leetcode 207. Course Schedule

https://leetcode.com/problems/course-schedule/#/description 图的算法题 题目就是求一堆课程有先修和后修的区别,这些课程能否构成拓扑排序而不矛盾: 应该算是我做的第一个关于图的算法题,一开始毫无思路,看了网上的sloutions,发现这道题还是比较简单的,可以用bfs和dfs都可以做.感觉还是比较典型的关于图算法例题. http://www.cnblogs.com/zmyvszk/p/5573234.html 这个题解讲的还是比较明白的,

【LeetCode】210. Course Schedule II

Course Schedule II There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number

【LeetCode】207. Course Schedule

Course Schedule There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of