Разбор задачи:

Предложенный нами код:

def corpFlightBookings(bookings, n):
    """
    :param bookings: List[List[int]] - Список бронирований, где каждое бронирование представлено списком [firsti, lasti, seatsi]
    :param n: int - количество рейсов
    :return: List[int] - Массив, где каждый элемент это общее количество забронированных мест для рейса
    """
    # Создаем массив для хранения количества мест на каждом рейсе
    seats = [0] * n
    
    # Проходим по всем бронированиям
    for first, last, seats_reserved in bookings:
        # Увеличиваем количество мест на рейсах в заданном диапазоне
        seats[first - 1] += seats_reserved
        if last < n:
            seats[last] -= seats_reserved
    
    # Преобразуем массив seats в окончательный результат с накоплением
    for i in range(1, n):
        seats[i] += seats[i - 1]
    
    return seats

Вот разбор решения задачи без упоминания сложности, с подробным объяснением каждого фрагмента:

Шаг 1: Инициализация массива

seats = [0] * n

Мы создаем массив seats длиной n (где n — количество рейсов), инициализируя все элементы значением 0. Этот массив будет использоваться для хранения количества забронированных мест на каждом рейсе.

Шаг 2: Обработка каждого бронирования

for first, last, seats_reserved in bookings:
    seats[first - 1] += seats_reserved
    if last < n:
        seats[last] -= seats_reserved
  • Мы проходим по каждому бронированию в списке bookings. Каждый элемент в bookings — это список [first, last, seats_reserved], где:
    • first — номер первого рейса в диапазоне бронирования,
    • last — номер последнего рейса в диапазоне бронирования,
    • seats_reserved — количество забронированных мест для каждого рейса в диапазоне от first до last.
  • Мы увеличиваем количество забронированных мест на рейсе с номером first (индекс first-1 в массиве seats) на количество мест, которое зарезервировано для этого рейса.
  • После этого, если последний рейс last не является последним рейсом в массиве, мы уменьшаем количество мест на рейсе с номером last + 1 (индекс last в массиве seats) на количество зарезервированных мест. Это важно, потому что бронирование действует на все рейсы от first до last включительно, и нужно компенсировать влияние на следующие рейсы.

Шаг 3: Накопление результатов

for i in range(1, n):
    seats[i] += seats[i - 1]

После того как все бронирования учтены, мы проходим по массиву seats начиная с индекса 1 и накапливаем количество забронированных мест. Это необходимо, потому что каждый элемент массива seats[i] теперь представляет собой общее количество мест, зарезервированных на рейсе с номером i+1, а не только для этого рейса.

Каждое обновление элемента массива происходит таким образом:

  • Сначала мы рассматриваем рейс с номером i+1 (индекс i в массиве seats).
  • Далее добавляем к количеству мест на текущем рейсе значение из предыдущего рейса (seats[i-1]), чтобы учесть все бронирования, которые могли повлиять на этот рейс.

Шаг 4: Возвращение результата

return seats

После того как все бронирования учтены и результаты накоплены, возвращается массив seats, где каждый элемент соответствует общему количеству мест, забронированных на соответствующем рейсе.

3. Пример:

Входные данные:

bookings = [[1, 2, 10], [2, 3, 20], [2, 5, 25]]
n = 5

Объяснение:

  • Для первого бронирования [1, 2, 10] зарезервировано 10 мест на рейсах 1 и 2.
  • Для второго бронирования [2, 3, 20] зарезервировано 20 мест на рейсах 2 и 3.
  • Для третьего бронирования [2, 5, 25] зарезервировано 25 мест на рейсах 2, 3, 4 и 5.

Шаги выполнения:

  1. Инициализация:

    seats = [0, 0, 0, 0, 0]
    
  2. Обработка бронирования [1, 2, 10]:
    • Увеличиваем seats[0] на 10 (рейс 1), получаем:

      seats = [10, 0, 0, 0, 0]
      
    • Уменьшаем seats[2] на 10 (рейс 3), получаем:

      seats = [10, 0, -10, 0, 0]
      
  3. Обработка бронирования [2, 3, 20]:
    • Увеличиваем seats[1] на 20 (рейс 2), получаем:

      seats = [10, 20, -10, 0, 0]
      
    • Уменьшаем seats[3] на 20 (рейс 4), получаем:

      seats = [10, 20, -10, -20, 0]
      
  4. Обработка бронирования [2, 5, 25]:
    • Увеличиваем seats[1] на 25 (рейс 2), получаем:

      seats = [10, 45, -10, -20, 0]
      
    • Уменьшаем seats[5] на 25 (рейс 6), получаем:

      seats = [10, 45, -10, -20, 25]
      
  5. Накопление:

    • Для рейса 2: seats[1] = 45 + 10 = 55
    • Для рейса 3: seats[2] = 45 + (-10) = 45
    • Для рейса 4: seats[3] = 45 + (-20) = 45
    • Для рейса 5: seats[4] = 45 + 25 = 45
    • Финальный результат:
    seats = [10, 55, 45, 25, 25]
    

Выходные данные:

[10, 55, 45, 25, 25]

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии