[LeetCode]207. Course Schedule

来源:互联网 发布:视频去噪声软件 编辑:程序博客网 时间:2024/05/28 23:21

https://leetcode.com/problems/course-schedule/?tab=Description

prerequisites里面的int[]表示要修课程int[0]必须先修int[1],求是否能修完所有课程



两解:

就是找是否有环



解法一:

indegree表示入度,matrix记录课程要求,从所有入度为0的点开始,删掉与当前点相连的所有边,如果删除后边的另一个点入度为零则加到queue内。环内的点始终不会加入到queue中,因此始终遍历不到,如果有环,count < numCourses

public class Solution {    public boolean canFinish(int numCourses, int[][] prerequisites) {        int[] indegree = new int[numCourses];        int[][] matrix = new int[numCourses][numCourses];        for (int i = 0; i < prerequisites.length; i++) {            int pre = prerequisites[i][1];            int ready = prerequisites[i][0];            if (matrix[pre][ready] == 0) {                indegree[ready]++;            }            matrix[pre][ready] = 1;        }        Queue<Integer> queue = new LinkedList();        for (int i = 0; i < numCourses; i++) {            if (indegree[i] == 0) {                queue.offer(i);            }        }        int count = 0;        while (!queue.isEmpty()) {            int course = queue.poll();            count++;            for (int i = 0; i < numCourses; i++) {                if (matrix[course][i] != 0) {                    if (--indegree[i] == 0) {                        queue.offer(i);                    }                }            }        }        return count == numCourses;    }}




解法二:

dfs,用visit记录当前访问过的点,如果重复访问就有环

public class Solution {    public boolean canFinish(int numCourses, int[][] prerequisites) {        ArrayList[] list = new ArrayList[numCourses];        for (int i = 0; i < list.length; i++) {            list[i] = new ArrayList();        }        for (int i = 0; i < prerequisites.length; i++) {            int ready = prerequisites[i][0];            int pre = prerequisites[i][1];            list[pre].add(ready);        }        boolean[] visit = new boolean[numCourses];        for (int i = 0; i < numCourses; i++) {            if (!dfs(list, visit, i)) {                return false;            }        }        return true;    }    private boolean dfs(ArrayList[] list, boolean[] visit, int index) {        if (visit[index]) {            return false;        }        visit[index] = true;        for (int i = 0; i < list[index].size(); i++) {            if (!dfs(list, visit, (int)(list[index].get(i)))) {                return false;            }        }        visit[index] = false;        return true;    }}


0 0
原创粉丝点击