У меня был следующий вопрос в интервью, и, несмотря на то, что я дал рабочую реализацию, это было недостаточно эффективно.
Ломкой массива A является любая пара целых чисел (P, Q) такая, что 0 ≤ P ≤ Q < N. Срез (P, Q) массива A делится на K, если число A [P] + A [P + 1] +... + A [Q-1] + A [Q] делится на K.
Функция, которую я попросил написать, должен был вернуть число делимых делителей на К. Ожидаемая сложность времени была O (max (N, K)), а сложность пространства была O (K).
Мое решение было самым простым, одним циклом внутри другого и проверить каждый срез: O (n ^ 2)
Я думал, но я действительно не могу понять, как это сделать в O (max (N, K)).
Это может быть вариант проблемы с подмножеством , но я не знаю, как подсчитывать каждый подмассив.
EDIT: Элементы в массиве могут быть отрицательными. Вот пример:
A = {4, 5, 0, -2, -3, 1}, K = 5
Function must return 7, because there are 7 subarrays which sums are divisible by 5
{4, 5, 0, -2, -3, 1}
{5}
{5, 0}
{5, 0, -2, -3}
{0}
{0, -2, -3}
{-2, -3}