美文网首页每日打卡
2021-12-14 课程表

2021-12-14 课程表

作者: 16孙一凡通工 | 来源:发表于2021-12-14 10:50 被阅读0次

    自己想不出来好的思路,这个题很经典,可以用拓扑排序,也可以用深度优先判定是否是个环来解决,
    思路就是建立一个入度数组,一个统计对应关系的arralist,和一个队列。
    从入度数组出发,统计零元素放入队列,队列剔除队首元素,并根据arraylist找到对应的下一个元素,
    得到下一个元素的入度,若是0,放入队列,继续这样的操作,知道队列是空的,
    java版本:

    class Solution {
        public boolean canFinish(int numCourses, int[][] prerequisites) {
    
    // 拓扑排序
    // 建立一个入度表,队列,和用来统计对应关系的数组,同时
    // 把入度是0的放入队列,同时队列不是空的时候出队首元素,同时入度·表的后向元素减减
    int[] arr=new int[numCourses];
    int pre;
    Queue<Integer> queue=new LinkedList<>();
    List<List<Integer>> list =new ArrayList<>();
    for (int i=0;i<numCourses;i++){
        list.add(new ArrayList<>());
    }
    for(int j=0;j<prerequisites.length;j++){
      pre=prerequisites[j][0];
       arr[pre]++;
     list.get(prerequisites[j][1]).add(pre);
    }
    
    for(int i=0;i<numCourses;i++){
        // System.out.println("arr:"+arr[i]);
     if(arr[i]==0)
         queue.add(i);
        
    
    }
     while(!queue.isEmpty()){
       pre= queue.poll();
      numCourses--;
    //    System.out.println("pre:"+pre);
      for(int cur:list.get(pre)){
          arr[cur]--;
        //    System.out.println("cur:"+cur);
        //    System.out.println("arr[cur]:"+arr[cur]);
    
          if(arr[cur]==0){
             
              queue.add(cur);
          }
          
      }
     }
    //  System.out.println("numcourse:"+numCourses);
     return numCourses==0; 
    
     }
    }
    

    相关文章

      网友评论

        本文标题:2021-12-14 课程表

        本文链接:https://www.haomeiwen.com/subject/jtmsfrtx.html