Estadísticas de reserva de vuelos, escuché que algunas personas que leyeron esta pregunta aún no la han entendido.

Prólogo

Hace unos días, un amigo me envió un enlace a un título de LeetCode, seguido de su propio registro de envío, uno 2ms, el otro 1451ms...

A primera vista, esta pregunta es un poco interesante: las diferentes ideas tienen mucha diferencia horaria. Participar en ello.

Descripción del título

Aquí hay nun vuelo, están numerados de 1a n.

Aquí tenemos un vuelo de reservar una mesa en la que los primeros idiscos libro de tiras bookings[i] = [i, j, k]medios que desde ila jreserva en cada vuelo kasientos.

Devuelva una nserie de longitudes y answerdevuelva el número de asientos reservados en cada vuelo en el orden del número de vuelo.

Ejemplos:

Entrada: reservas = [[1,2,10], [2,3,20], [2,5,25]], n = 5

Salida: [10,55,45,25,25]

Solución O (m * n)

El problema destinado para inicializar la longitud de nla answermatriz, que representa 1el nnúmero de asientos de la reserva número de vuelo, atravesando el exterior bookings, interior poligonal bookings[i] = [i, j, k]calculado número de vuelo ipara jel número de asientos, número de asientos que se aplica actualmente k.

public int[] corpFlightBookings(
        int[][] bookings, int n) {

    int[] answer = new int[n];

    // 遍历整个bookings数组
    for (int[] b : bookings) {
        // 内层循环把每个航班预订数加上
        for (int i = b[0] - 1;
             i <= b[1] - 1; i++) {
            answer[i] += b[2];
        }
    }
    return answer;
}

O (n) solución

Pensando

O(m*n)El punto clave en la solución es que hemos [i, j]agregado repetidamente el ciclo interno en el medio k, ¡cómo convertir este ciclo en O(1)una clave del problema!

[i, j]Además k, esto me recuerda la secuencia aritmética. ¿No es esta kla secuencia aritmética de tolerancia ? Entonces que?

Análisis

Indiquemos answer[i]el inúmero de asientos reservados para el primer vuelo. Defina una matriz de diferencias d[]que d[i]represente la idiferencia entre el primer vuelo y el i-1asiento reservado del primer vuelo, es decir d[i] = answer[i] - answer[i - 1].

De esta manera, cada vez que atravesamos bookings[i] = [i, j, k], sólo tenemos que d[i]aumentar k, d[j + 1]disminución kpuede ser, porque ide jentre no se cambia el número de reserva de vuelo.

Finalmente, calcula answer[i] = answer[i - 1] + d[i]y devuelve answer.

Deducción

Bueno, esto puede no ser entendido por nadie. Vamos a deducir una vez de acuerdo con el ejemplo del tema:

  • Matriz de cantidad de reserva de vuelo inicial answer = [0,0,0,0,0], matriz de diferenciad = [0,0,0,0,0]
  • Al atravesar bookings[0] = [1,2,10], el primer bit de la matriz de diferencia aumenta en 10, y el tercer bit disminuye en 10, convirtiéndose end = [10,0,-10,0,0]
  • Del mismo modo, cuando se atraviesa bookings[1] = [2,3,20], la matriz de diferencia se convierted = [10,20,-10,-20,0]
  • Cuando se alcanza el recorrido bookings[2] = [2,5,25], la matriz de diferencia se convierte d = [10,45,-10,-20,0], el sexto bit se reduce en 25 y no lo necesitamos.
  • Por último, se calcula el answervalor de la answer[0] = d[0] = 10matriz, answer[1] = d[1] + answer[0] = 45 + 10 = 55,, answer[2] = d[2] + answer[1] = -10 + 55 = 45...
  • Finalmente, descubrí que solo necesito solicitar una matriz para representar la d[]suma answer[], ¡más!

Código

public int[] corpFlightBookings(
        int[][] bookings, int n) {

    int[] answer = new int[n];

    // 遍历bookings 计算航班i+1 对航班i 变化的预订数
    for (int[] b : bookings) {
        // 增加的预订数
        answer[b[0] - 1] += b[2];
        // 防止数组越界
        if (b[1] < n) {
            // 减少的预订数量
            answer[b[1]] -= b[2];
        }
    }

    // 航班i的预订数等于,i-1的预订数,加i时刻变化的预定数
    for (int i = 1; i < n; i++) {
        answer[i] += answer[i - 1];
    }
    return answer;
}

Compartir

¿Crees que esto ha terminado? No seas demasiado ingenuo. Eche otro vistazo a esta pregunta, tal vez le traerá nuevas ideas.

Descripción del título

Supongamos que usted es un paseo conductor, el coche inicialmente capacityasientos vacíos se puede utilizar para transportar pasajeros. Debido a las restricciones de la carretera, el automóvil solo puede viajar en una dirección (es decir, no está permitido girar o cambiar de dirección, puede considerarlo como un vector).

Aquí es un programa de viaje trips[][], que trips[i] = [num_passengers, start_location, end_location]incluye su primera iinformación de viaje en el tiempo:

El número de pasajeros que deben ser recogidos;
el lugar donde se
suben los pasajeros ; y el lugar donde se bajan los pasajeros.
Estas ubicaciones de ubicación dadas son las distancias requeridas para viajar hacia adelante desde su ubicación de inicio inicial a estas ubicaciones (deben estar en su dirección de viaje).

Usted de acuerdo con el número de asientos determinado itinerario de viaje y el coche para determinar si su coche puede completar las transferencias de trabajo utilizados por los pasajeros sin problemas (si y sólo si se puede recoger todos los pasajeros en cualquier viaje dado, de retorno true, De lo contrario, regrese false).

Ejemplo 1:

Entrada: viajes = [[2,1,5], [3,3,7]], capacidad = 4

Salida: falso

Ejemplo 2

Entrada: viajes = [[2,1,5], [3,3,7]], capacidad = 5

Salida: verdadero

Consejos:

  • Puede suponer que los pasajeros acatarán conscientemente la buena calidad de "primero abajo y luego arriba"
  • trips.length <= 1000
  • 1 <= trips[i][0] <= 100

Análisis de tema

En realidad, esta pregunta es si el número de asientos en el automóvil puede satisfacer a ilos pasajeros de cada viaje , es decir, cada pasajero se sienta en el asiento y regresa truesi puede , de lo contrario, regresa false.

Si podemos calcular el itinerario i, el número de pasajeros que tomarán el autobús y luego capacitycompararlo, podemos obtener la respuesta.

Obviamente, el número de pasajeros a bordo del vehículo = el número de pasajeros originales en el vehículo, el número de pasajeros que se bajan del vehículo + el número de pasajeros que se suben al vehículo .

Ideas

Podemos usar matrices o mapas para registrar el itinerario i, la cantidad de pasajeros que se bajan y la cantidad de pasajeros que suben al autobús, y luego comenzar y finalizar el viaje, calculando la cantidad de pasajeros que se abordarán y se capacitycompararán con él.

Código para implementar la versión del mapa

public boolean carPooling(
        int[][] trips, int capacity) {
    // 使用TreeMap 是为了让元素根据key排序
    TreeMap<Integer, Integer> map =
            new TreeMap<>();
    for (int[] t : trips) {
        int v = map.getOrDefault(t[1], 0) + t[0];
        // 上车乘客数量
        map.put(t[1], v);
        v = map.getOrDefault(t[2], 0) - t[0];
        // 下车乘客数量
        map.put(t[2], v);
    }

    int cur = 0;

    for (Map.Entry<Integer, Integer> entry
            : map.entrySet()) {
        Integer value = entry.getValue();
        // 当前数量=之前数量+变化的数量
        cur += value;

        if (cur > capacity) {
            return false;
        }
    }
    return true;
}

Código para implementar la versión de matriz

public boolean carPooling(
        int[][] trips, int capacity) {

    // 最远行程 数组长度
    int max = 0;
    for (int[] t : trips) {
        max = Math.max(max, t[2]);
    }

    // 所有要乘车的乘客数量
    int[] passengers = new int[max + 1];
    for (int[] t : trips) {
        passengers[t[1]] += t[0];
        passengers[t[2]] -= t[0];
    }

    int cur = 0;
    for (int passenger : passengers) {
        // 当前数量 = 之前数量 + 变化的数量
        cur += passenger;
        if (cur > capacity) {
            return false;
        }
    }

    return true;
}

Mirar hacia atrás

El código y las escenas de compartir el automóvil son más fáciles de entender, porque así somos en la vida. Primero podemos bajar y luego continuar. Depende de cuántas personas estén en el automóvil y cuántas personas se bajen.

Volvemos a analizar la cuestión de las estadísticas de reserva de vuelos, que en realidad es el mismo problema que compartir el viaje .

Vi a alguien preguntando, al calcular el bookings[i] = [i, j, k]número de cambios de reserva, ¿por qué se j + 1resta la primera posición k, no jla posición? Debido j - 1a la ubicación, se debe añadir reservas aéreas número de asientos k, y la jubicación, reservas de vuelos también aumentar el número de asientos k, de modo jy j - 1el número está entre ningún cambio. Sin embargo, j + 1el número de vuelos de ubicación ya no se agrega k, por lo que se reduce el número de reservas en j + 1relación con jlos vuelos de ubicación k.

El problema del uso compartido del automóvil es que trips[i][j], en el jlugar, cuando el automóvil llega a la estación, el pasajero sale del automóvil y toma otra parada para pasar la estación ...

En resumen, las dos preguntas son esencialmente de la misma naturaleza, solo que ligeramente diferentes en detalles.

Bienvenido a prestar atención a la cuenta pública personal de WeChat [como navegar contra la corriente] y publicar cuidadosamente la serie de artículos sobre conceptos básicos, algoritmos y código fuente.

Supongo que te gusta

Origin www.cnblogs.com/opensheng/p/12689110.html
Recomendado
Clasificación