LeetCode210——课程表II

版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/83510893

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/course-schedule-ii/description/

题目描述:

知识点:拓扑排序

思路:拓扑排序

本题的实现和LeetCode207——课程表一模一样,只不过在拓扑排序的时候多用了一个数组来记录顺序。

时间复杂度和空间复杂度均是O(n)。

JAVA代码:

public class Solution {

    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] inDegree = new int[numCourses];
        int[][] graph = new int[numCourses][numCourses];
        for(int i = 0; i < prerequisites.length; i++){
            graph[prerequisites[i][1]][prerequisites[i][0]] = 1;
            inDegree[prerequisites[i][0]]++;
        }
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0; i < numCourses; i++){
            if(inDegree[i] == 0){
                queue.add(i);
            }
        }
        int[] result = new int[numCourses];
        int index = 0;
        int num = 0;
        while(!queue.isEmpty()){
            int u = queue.poll();
            result[index++] = u;
            for(int v = 0; v < numCourses; v++){
                if(graph[u][v] != 0){
                    inDegree[v]--;
                    if(inDegree[v] == 0){
                        queue.add(v);
                    }
                }
            }
            num++;
        }
        if(num != numCourses){
            result = new int[0];
        }
        return result; 
    }
}

JAVA解题报告:

C++代码:

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        int inDegree[numCourses] = {0};
		vector<int> graph[numCourses];
		for(int i = 0; i < prerequisites.size(); i++){
			graph[prerequisites[i].second].push_back(prerequisites[i].first);
			inDegree[prerequisites[i].first]++;
		}
		queue<int> q;
		for(int i = 0; i < numCourses; i++){
			if(inDegree[i] == 0){
				q.push(i);
			}
		}
		int num = 0;
		vector<int> result;
		while(!q.empty()){
			int u = q.front();
			result.push_back(u);
			q.pop();
			for(int j = 0; j < graph[u].size(); j++){
				int v = graph[u][j];
				inDegree[v]--;
				if(inDegree[v] == 0){
					q.push(v);
				}
			}
			num++;
		}
		if(num != numCourses){
			result.clear();
		}
		return result;
    }
};

C++解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/83510893