Программа курса:
Разбор задачи:
Предложенный нами код:
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.
Шаги выполнения:
Инициализация:
seats = [0, 0, 0, 0, 0]- Обработка бронирования
[1, 2, 10]:Увеличиваем
seats[0]на 10 (рейс 1), получаем:seats = [10, 0, 0, 0, 0]Уменьшаем
seats[2]на 10 (рейс 3), получаем:seats = [10, 0, -10, 0, 0]
- Обработка бронирования
[2, 3, 20]:Увеличиваем
seats[1]на 20 (рейс 2), получаем:seats = [10, 20, -10, 0, 0]Уменьшаем
seats[3]на 20 (рейс 4), получаем:seats = [10, 20, -10, -20, 0]
- Обработка бронирования
[2, 5, 25]:Увеличиваем
seats[1]на 25 (рейс 2), получаем:seats = [10, 45, -10, -20, 0]Уменьшаем
seats[5]на 25 (рейс 6), получаем:seats = [10, 45, -10, -20, 25]
Накопление:
- Для рейса 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]- Для рейса 2:
Выходные данные:
[10, 55, 45, 25, 25]