潍坊免费自助建站模板,网站建设服务便宜,网站设计入门,桂林旅游网站建设题目#xff1a;
现在你总共有 numCourses 门课需要选#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites #xff0c;其中 prerequisites[i] [ai, bi] #xff0c;表示在选修课程 ai 前 必须 先选修 bi 。
例如#xff0c;想要学习课程 0 #xff0c;…题目
现在你总共有 numCourses 门课需要选记为 0 到 numCourses - 1。给你一个数组 prerequisites 其中 prerequisites[i] [ai, bi] 表示在选修课程 ai 前 必须 先选修 bi 。
例如想要学习课程 0 你需要先完成课程 1 我们用一个匹配来表示[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序你只要返回 任意一种 就可以了。如果不可能完成所有课程返回 一个空数组 。
示例
示例 1
输入numCourses 2, prerequisites [[1,0]]
输出[0,1]
解释总共有 2 门课程。要学习课程 1你需要先完成课程 0。因此正确的课程顺序为 [0,1] 。示例 2
输入numCourses 4, prerequisites [[1,0],[2,0],[3,1],[3,2]]
输出[0,2,1,3]
解释总共有 4 门课程。要学习课程 3你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
示例 3
输入numCourses 1, prerequisites []
输出[0]
思路
利用列表和栈等数据结构通过深度优先遍历就行排列优先级。具体代码如下。
代码
class Solution {private ListInteger[] list;private boolean isValid true;private int[] visited;public int[] findOrder(int numCourses, int[][] prerequisites) {visited new int[numCourses];StackInteger stack new Stack();list new ArrayList[numCourses];for(int i 0; i numCourses; i){list[i] new ArrayList();}for(int[] arr: prerequisites){list[arr[1]].add(arr[0]);}//讲数据加入栈中for(int i 0; i numCoursesisValid;i){if(visited[i] 0) dfs(i,stack);}if(!isValid){return new int[]{};}int[] ans new int[numCourses];int i 0;while(!stack.isEmpty()){ans[i] stack.pop();}return ans;}private void dfs(Integer node,StackInteger stack){visited[node] -1;ListInteger templist list[node];for(Integer s: templist){//没有访问过的节点if(visited[s] 0){dfs(s,stack);//存在环形,直接返回} else if(visited[s] -1){isValid false;return;}}//成功访问visited[node] 1;stack.push(node);}
}