Программа курса:
Разбор задачи: Год максимальной численности населения
Предложенный нами код решения:
def maximumPopulation(logs):
"""
Определяет самый ранний год с максимальным населением.
:param logs: Список пар [год рождения, год смерти] для каждого человека
:return: Самый ранний год с максимальным населением
"""
# Создаем массив для отслеживания изменений численности населения
years = [0] * 101 # Диапазон лет: 1950–2050
# Обновляем население для каждого года
for birth, death in logs:
years[birth - 1950] += 1 # Начало жизни человека
years[death - 1950] -= 1 # Конец жизни (год смерти не включается)
# Находим год с максимальной численностью населения
max_population = 0
max_year = 1950
current_population = 0
for year in range(101):
current_population += years[year]
if current_population > max_population:
max_population = current_population
max_year = year + 1950
return max_year
Цель задачи:
Определить самый ранний год, когда население было на максимальном уровне, учитывая, что человек включается в население начиная с года рождения и до года, предшествующего году смерти.
Шаги решения
1. Инициализация массива для учета изменений населения
years = [0] * 101 # Диапазон лет: 1950–2050
Мы создаем массив years длиной 101, где каждый индекс соответствует году, начиная с 1950 (индекс 0 — это 1950, индекс 1 — это 1951 и так далее). Этот массив используется для отслеживания прироста или убыли населения в каждом году.
2. Обновление численности населения по годам
for birth, death in logs:
years[birth - 1950] += 1 # Начало жизни человека
years[death - 1950] -= 1 # Конец жизни (год смерти не включается)
Каждый человек увеличивает население с года своего рождения (birth), поэтому мы увеличиваем значение в массиве на соответствующем индексе birth - 1950. Аналогично, смерть уменьшает население, начиная с года смерти (death), поэтому мы уменьшаем значение в массиве на индексе death - 1950.
Пример:
Для logs = [[1950, 1961], [1960, 1971], [1970, 1981]]:
- При обработке
[1950, 1961]:- Увеличиваем
years[1950 - 1950]на 1 (население в 1950 году увеличилось на 1). - Уменьшаем
years[1961 - 1950]на 1 (население в 1961 году уменьшилось на 1).
- Увеличиваем
- Для
[1960, 1971]и[1970, 1981]изменения аналогичны.
3. Нахождение максимального населения
max_population = 0
max_year = 1950
current_population = 0
Инициализируем переменные для отслеживания текущего населения (current_population), максимального населения (max_population) и года с максимальным населением (max_year).
4. Подсчет населения по каждому году
for year in range(101):
current_population += years[year]
if current_population > max_population:
max_population = current_population
max_year = year + 1950
Постепенно накапливаем население для каждого года, добавляя значение из массива years. Если текущее население превышает максимальное, обновляем max_population и фиксируем текущий год как max_year.
Пример:
Для массива изменений:
years = [1, 0, ..., -1, 1, 0, ..., -1]
- Год 1950:
current_population = 1→ Обновляемmax_populationдо 1 иmax_yearдо 1950. - Год 1960:
current_population = 2→ Обновляемmax_populationдо 2 иmax_yearдо 1960. - Аналогично продолжаем до конца массива.
5. Возврат результата
return max_year
Возвращаем самый ранний год, в котором наблюдалось максимальное население.
Плюсы подхода
- Эффективное использование памяти: Для учета изменений используется массив фиксированного размера.
- Простота логики: Обновление населения и поиск максимума выполняются поочередно, что делает алгоритм интуитивно понятным.
- Корректность обработки границ: Учитывается, что человек включается в население начиная с года рождения и до года, предшествующего году смерти.