• LeetCode 207. Course Schedule 课程表 (C++/Java)


    题目:

    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?

    Example 1:

    Input: 2, [[1,0]] 
    Output: true
    Explanation: There are a total of 2 courses to take. 
                 To take course 1 you should have finished course 0. So it is possible.

    Example 2:

    Input: 2, [[1,0],[0,1]]
    Output: false
    Explanation: 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.

    分析:

    给定n门课程和他们之间的先修关系,例如[1, 0]就表示修1这门课程要先修完0,判断能否学完所有的课程。

    很明显,如果课程中存在循环,就不能完成全部课程。记录每门课程之间的先后顺序,用map存储起来。遍历所有的课程,使用visit数组用来记录每门课程的访问状态,1表示正在访问,2表示已经访问过,访问课程后,在遍历这门课的后续课程,递归执行,如果出现访问的课程状态为1,也就是正在访问,那么表示图中存在环,返回false即可。

    程序:

    C++

    class Solution {
    public:
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            courses = vector<vector<int>> (numCourses);
            for(auto a:prerequisites){
                courses[a[1]].push_back(a[0]);
            }
            vector<int> visit(numCourses);
            for(int i = 0; i < numCourses; ++i)
                if(dfs(i, visit))
                    return false;
            return true;
        }
    private:
        bool dfs(int curr, vector<int>& visit){
            if(visit[curr] == 1)
                return true;
            if(visit[curr] == 2)
                return false;
            visit[curr] = 1;
            for(auto i:courses[curr])
                if(dfs(i, visit))
                    return true;
            visit[curr] = 2;
            return false;
        }
        vector<vector<int>> courses;
    };

    Java

    class Solution {
        public boolean canFinish(int numCourses, int[][] prerequisites) {
            for(int[] arr:prerequisites){
                List<Integer> list = courses.getOrDefault(arr[1], new ArrayList<>()); 
                list.add(arr[0]);
                courses.put(arr[1], list);
            }
            int[] visit = new int[numCourses];
            for(int i = 0; i < numCourses; ++i){
                if(dfs(i, visit))
                    return false;
            }
            return true;
        }
        private boolean dfs(int curr, int[] visit){
            if(visit[curr] == 1)
                return true;
            if(visit[curr] == 2)
                return false;
            visit[curr] = 1;
            List<Integer> list = courses.get(curr);
            if(list != null){
                for(int i:list){
                    if(dfs(i, visit))
                        return true;
                }
            }
             visit[curr] = 2;
            return false;
        }
        private Map<Integer, List<Integer>> courses = new HashMap<>();
    }
  • 相关阅读:
    Xcode6中如何添加pch文件
    iOS 在UILabel显示不同的字体和颜色
    IOS 获取手机ip地址
    获取设备基本信息
    [__NSCFConstantString size]: unrecognized selector sent to instance 错误
    控制器之间的跳转,多层的跳转
    Multiple build commands for output file
    Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad; using 3876877096_Portrait_iPhone-Simple-Pad_Default
    Activity的生命之路
    Spring自定义标签
  • 原文地址:https://www.cnblogs.com/silentteller/p/12383191.html
Copyright © 2020-2023  润新知