• leetcode210


    public class Solution {
        
        //test case [1,0]
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            int[] map = new int[numCourses];
            int n = prerequisites.length;
            int[] res = new int[numCourses];
            
            for(int i=0; i<n; i++) {
                map[ prerequisites[i][1] ] ++;
            }
            
            Queue<Integer> que = new LinkedList<Integer>();
            int index = numCourses-1;
            for(int i=0; i<numCourses; i++) {
                if(map[i] == 0) {
                    que.add(i);
                    res[index--] = i;
                }
            }
            
            while(!que.isEmpty() ){
                int k = que.remove();
                for(int i=0; i<n; i++) {
                    int l = prerequisites[i][1];
                    if(k==prerequisites[i][0]) {
                        map[l]--;
                        if(map[l] == 0) {
                            que.add(l);
                            res[index--] = l;
                        }
                    }
                }
            }
            if(index!=-1) return new int[0];
            else return res;
        }
    }

    补充一个python的实现,使用深度优先遍历,进行拓扑排序:

     1 class Solution:
     2     def dfs(self,visited,memo,dic,i,postCourse):
     3         if visited[i]:
     4             return True
     5         if memo[i] == 0:
     6             return False
     7         elif memo[i] == 1:
     8             return True
     9         for cs in dic[i]:
    10             visited[i] = True
    11             bl = self.dfs(visited,memo,dic,cs,postCourse)
    12             visited[i] = False
    13             if bl:
    14                 memo[i] = 1
    15                 return True
    16         memo[i] = 0
    17         postCourse.append(i)
    18         return False
    19     def findOrder(self, numCourses: int, prerequisites: 'List[List[int]]') -> 'List[int]':
    20         dic = {}
    21         n = len(prerequisites)
    22         for i in range(numCourses):
    23             dic[i] = []
    24         for i in range(n):
    25             cs = prerequisites[i][0]#当前课程
    26             pre = prerequisites[i][1]#前置课程
    27             dic[cs].append(pre)
    28         visited = [False for _ in range(numCourses)]
    29         memo = [-1 for _ in range(numCourses)]
    30         postCourse = []
    31         for i in range(numCourses):
    32             if self.dfs(visited,memo,dic,i,postCourse):
    33                 return []
    34         return postCourse
  • 相关阅读:
    操作系统 进程(下)
    操作系统 进程(上)
    进程的执行状态
    操作系统之内存与进程
    阿里巴巴一道笔试题
    ASP.NET 验证码 不同浏览器 不刷新问题
    Android常用控件之GridView使用BaseAdapter
    spoj 8222 Substrings (后缀自动机)
    【每天一个Linux命令】13. Linux中whereis命令的用法
    JSP 文件上传下载系列之二[Commons fileUpload]
  • 原文地址:https://www.cnblogs.com/asenyang/p/9826576.html
Copyright © 2020-2023  润新知