La espada se refiere a la oferta 113: Orden del curso

Pregunta:
Hay un total de numCourses cursos para seleccionar, que están marcados como 0 a numCourses-1.
Dada una matriz de prerrequisitos, cada elemento de prerrequisitos[i] representa el orden de prerrequisitos entre dos cursos. Por ejemplo, prerrequisitos[i] = [ai, bi] significa que si desea estudiar el curso ai, primero debe completar el curso bi.
Encuentre una secuencia de cursos factible basada en el número total dado de cursos numCursos y requisitos previos que indican los requisitos previos.
Puede haber más de un pedido correcto, simplemente devuelva cualquiera. Devuelve una matriz vacía si no es posible completar todos los cursos.
Ejemplo 1:
Entrada: numCourses = 2, requisitos previos = [[1,0]]
Salida: [0,1]
Explicación: Hay 2 cursos en total. Para estudiar el Curso 1, primero debe completar el Curso 0. Entonces, el orden correcto del curso es [0,1].

Ejemplo 2:
Entrada: numCourses = 4, requisitos previos = [[1,0],[2,0],[3,1],[3,2]]
Salida: [0,1,2,3] o [0 ,2,1,3]
Explicación: Hay 4 cursos en total. Para estudiar el Curso 3, primero debe completar el Curso 1 y el Curso 2. Y tanto el curso 1 como el curso 2 deben venir después del curso 0.
Por lo tanto, un orden de curso correcto es [0,1,2,3]. Otro orden correcto es [0,2,1,3].

Ejemplo 3:
Entrada: numCourses = 1, requisitos previos = []
Salida: [0]
Explicación: Hay un total de 1 curso, solo tome el primer curso directamente.
Análisis:
piense en los cursos como nodos en el gráfico. Si dos cursos tienen una secuencia de requisitos previos, entonces hay un borde entre los nodos correspondientes en el gráfico entre los cursos de requisitos previos y los últimos cursos, por lo que este es un gráfico dirigido.
numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] El grafo dirigido construido como se muestra a continuación es una
inserte la descripción de la imagen aquí
secuencia de cursos factible que en realidad es una especie topológica de la Secuencia del gráfico, cada borde del gráfico es desde el curso previo al curso posterior, y la clasificación topológica puede garantizar que el nodo inicial de cualquier borde debe estar delante del nodo final, por lo que la secuencia obtenida por clasificación topológica es el mismo que el orden previo al curso No habrá conflictos, por lo que el problema se convierte en cómo encontrar una secuencia ordenada topológicamente de grafos dirigidos.
Este problema utiliza el algoritmo de clasificación topológica.
Vea el código para más detalles.
Código:

package com.kuang;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class FindOrder {
    
    
    public int[] findOrder(int numCourses, int[][] prerequisites) {
    
    
//        先创建一个邻接表,键是先修课程,值是必须在键对应的课程之后学习的所有课程
        HashMap<Integer, List<Integer>> graph = new HashMap<>();
        for (int i = 0; i < numCourses; i++) {
    
    
            graph.put(i,new LinkedList<Integer>());
        }
//        将每个节点的入度保存到数组inDegrees中
        int[] inDegrees = new int[numCourses];
        for (int[] preq:prerequisites){
    
    
            graph.get(preq[1]).add(preq[0]);
//            preq[0]节点入度加1
            inDegrees[preq[0]]++;
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
    
    
            if (inDegrees[i] ==0){
    
    
                queue.add(i);
            }
        }
        List<Integer> order = new LinkedList<>();
        while (!queue.isEmpty()){
    
    
           int course = queue.remove();
           order.add(course);
           for (int next:graph.get(course)){
    
    
               inDegrees[next]--;
               if (inDegrees[next]==0){
    
    
                   queue.add(next);
               }
           }
        }
        return order.size() == numCourses ?order.stream().mapToInt(i->i).toArray():new int[0];
    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/123986630
Recomendado
Clasificación