Префиксные суммы
Сумма подмассива, равная k
Посчитать количество непрерывных подмассивов с суммой k
Постановка задачи
Описание (LeetCode)
Дан массив целых чисел nums и целое число k. Нужно вернуть количество
непустых непрерывных подмассивов, сумма которых равна k.
Подмассив - это непрерывная часть исходного массива.
Пример 1:
nums = [1, 1, 1], k = 2
Результат:
2
Пояснение:
Есть два подходящих подмассива: [1, 1] на индексах 0..1 и [1, 1] на
индексах 1..2.
Пример 2:
nums = [1, 2, 3], k = 3
Результат:
2
Пояснение:
Подходящие подмассивы: [1, 2] и [3].
Ограничения:
1 <= nums.length <= 2 * 10⁴-1000 <= nums[i] <= 1000-10⁷ <= k <= 10⁷
Решение
Для решения этой задачи первая идея, которая приходит на ум - это перебор
подмассивов. Можно выбрать левую границу, правую границу и посчитать сумму между
ними. Но так мы быстро приходим к сложности O(n²), а если еще пересчитывать
сумму каждый раз с нуля, то и к O(n³).
Префиксные суммы позволяют избежать лишних пересчетов. Если мы знаем сумму всех элементов от начала массива до текущего индекса, то сумма любого подмассива получается как разность двух префиксных сумм.
Идея решения:
Обозначим prefixSum как сумму элементов от начала массива до текущего индекса.
Пусть мы сейчас на позиции r, и хотим понять, сколько подмассивов с правой
границей в r имеют сумму k.
Перейдите на Premium, чтобы продолжить
Разблокируйте доступ к этой статье и всем остальным материалам с NowInterview Premium
Перейти на Premium