Разбор задачи: Год максимальной численности населения

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

 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

Возвращаем самый ранний год, в котором наблюдалось максимальное население.


Плюсы подхода

  1. Эффективное использование памяти: Для учета изменений используется массив фиксированного размера.
  2. Простота логики: Обновление населения и поиск максимума выполняются поочередно, что делает алгоритм интуитивно понятным.
  3. Корректность обработки границ: Учитывается, что человек включается в население начиная с года рождения и до года, предшествующего году смерти.

 



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