454. 4Sum II
On This Page
Задача
Даны четыре списка A
, B
, C
, D
целых чисел. Вычислите, сколько существует таких кортежей (i, j, k, l)
, что ( A[i] + B[j] + C[k] + D[l] = 0 ).
Подсказки
Используйте хэш-таблицу для ускорения решения.
Подход
- Создание хэш-таблицы: Сначала создайте хэш-таблицу, которая будет хранить суммы пар чисел из массивов
A
иB
. - Подсчет сумм: Для каждой пары
(i, j)
изA
иB
, увеличьте соответствующий элемент хэш-таблицы на 1. - Поиск в хэш-таблице: Для каждой пары
(k, l)
изC
иD
, проверьте, существует ли-(C[k] + D[l])
в хэш-таблице. Если да, увеличьте счетчик на соответствующее значение из хэш-таблицы. - Возврат результата: Верните значение счетчика.
Этот метод является простым и эффективным с точки зрения времени.
Алгоритм
- Инициализируйте
counter = 0
и хэш-таблицуsums
. - Посчитайте суммы для всех пар
(i, j)
изA
иB
и сохраните их вsums
. - Переберите все пары
(k, l)
изC
иD
и проверьте наличие-(C[k] + D[l])
вsums
.
Решение
from collections import defaultdict
def fourSumCount(A, B, C, D):
counter = 0
sums = defaultdict(int)
# Считаем суммы для всех пар из A и B
for i in A:
for j in B:
sums[i + j] += 1
# Проверяем наличие -(C[k] + D[l]) в хэш-таблице
for k in C:
for l in D:
if -(k + l) in sums:
counter += sums[-(k + l)]
return counter