Разбор задачи: Сумма четных чисел после запросов

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

 def sumEvenAfterQueries(nums, queries):
    """
    :param nums: List[int] - исходный массив целых чисел
    :param queries: List[List[int]] - массив запросов
    :return: List[int] - массив сумм чётных чисел после каждого запроса
    """
    # Инициализируем начальную сумму чётных чисел
    even_sum = sum(num for num in nums if num % 2 == 0)
    result = []

    # Обрабатываем каждый запрос
    for val, idx in queries:
        # Если текущее значение nums[idx] чётное, вычитаем его из even_sum
        if nums[idx] % 2 == 0:
            even_sum -= nums[idx]
        
        # Обновляем значение nums[idx]
        nums[idx] += val
        
        # Если обновлённое значение nums[idx] чётное, добавляем его в even_sum
        if nums[idx] % 2 == 0:
            even_sum += nums[idx]
        
        # Сохраняем текущую сумму чётных чисел
        result.append(even_sum)
    
    return result

Инициализация суммы четных чисел

even_sum = sum(num for num in nums if num % 2 == 0)
  • Сначала мы вычисляем сумму всех четных чисел в массиве nums.
  • Для этого используется генератор, который проверяет каждое число: num % 2 == 0 (остаток от деления на 2 равен нулю означает, что число четное).

Пример:

  • Пусть nums = [1, 2, 3, 4].
  • Четные числа: 2, 4.
  • even_sum = 2 + 4 = 6.

Инициализация результата

result = []
  • В этот список мы будем записывать результат выполнения каждого запроса — текущую сумму четных чисел.

Обработка каждого запроса

for val, idx in queries:
  • Мы перебираем все запросы из массива queries, где val — значение, которое нужно прибавить, а idx — индекс в массиве nums, к которому это значение прибавляется.

Шаг 1: Уменьшаем even_sum, если число станет нечётным

if nums[idx] % 2 == 0:
    even_sum -= nums[idx]
  • Если текущее значение в nums[idx] четное (например, nums[idx] = 4), то оно уже включено в even_sum.
  • Но после изменения оно может стать нечетным, поэтому заранее исключаем его из суммы.

Пример:

  • Пусть nums = [1, 2, 3, 4], queries = [[1, 0]]. Начальное even_sum = 6.
  • В текущем запросе мы изменяем nums[0] (индекс 0, значение 1).
  • Поскольку nums[0] нечетное, even_sum остается без изменений.

Шаг 2: Обновляем значение

nums[idx] += val
  • Прибавляем значение val к элементу массива nums[idx].

Пример:

  • Пусть nums = [1, 2, 3, 4], queries = [[1, 0]].
  • Мы изменяем nums[0] на nums[0] + 1, т.е. nums = [2, 2, 3, 4].

Шаг 3: Добавляем число обратно в even_sum, если оно стало чётным

if nums[idx] % 2 == 0:
    even_sum += nums[idx]
  • После изменения проверяем, стало ли число четным. Если да, то добавляем его обратно в even_sum.

Пример:

  • После изменения nums[0] = 2, это четное число, поэтому even_sum += 2.
  • Теперь even_sum = 8.

Шаг 4: Сохраняем текущую сумму в результат

result.append(even_sum)
  • Добавляем текущее значение even_sum в массив result.

Пример:

  • После первого запроса результат: result = [8].

Возвращаем результат

return result
  • Возвращаем массив result, содержащий сумму всех четных чисел после каждого запроса.

Пример выполнения

Рассмотрим пример:

nums = [1, 2, 3, 4]
queries = [[1, 0], [-3, 1], [-4, 0], [2, 3]]
  1. Начальное состояние:
    nums = [1, 2, 3, 4], четные числа: 2, 4, even_sum = 6.
  2. Первый запрос: [1, 0]
    • Обновляем nums[0]: nums[0] = nums[0] + 1 = 2.
    • Новое состояние: nums = [2, 2, 3, 4].
    • Четные числа: 2, 2, 4.
    • even_sum = 2 + 2 + 4 = 8.
    • result = [8].
  3. Второй запрос: [-3, 1]
    • Уменьшаем nums[1]: nums[1] = nums[1] - 3 = -1.
    • Новое состояние: nums = [2, -1, 3, 4].
    • Четные числа: 2, 4.
    • even_sum = 2 + 4 = 6.
    • result = [8, 6].
  4. Третий запрос: [-4, 0]
    • Уменьшаем nums[0]: nums[0] = nums[0] - 4 = -2.
    • Новое состояние: nums = [-2, -1, 3, 4].
    • Четные числа: -2, 4.
    • even_sum = -2 + 4 = 2.
    • result = [8, 6, 2].
  5. Четвертый запрос: [2, 3]
    • Увеличиваем nums[3]: nums[3] = nums[3] + 2 = 6.
    • Новое состояние: nums = [-2, -1, 3, 6].
    • Четные числа: -2, 6.
    • even_sum = -2 + 6 = 4.
    • result = [8, 6, 2, 4].

 



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