我在一次采访中遇到了以下问题,尽管我给出了一个可行的实现,但它的效率还不够高。
数组 A 的切片是满足 0 ≤ P ≤ Q < N 的任意整数对 (P, Q)。如果数字 A[P] + A[P +1] + ... + A[Q−1] + A[Q] 可以被 K 整除。
我被要求编写的函数必须返回可被 K 整除的切片数。预期的时间复杂度为 O(max(N, K)),空间复杂度为 O(K)。
我的解决方案是最简单的,一个循环在另一个循环中检查每个切片:O(n^2)
我一直在想,但我真的不知道如何在 O(max(N, K)) 中做到这一点。
它可能是子集和问题的变体,但我不知道如何计算每个子数组。
编辑:数组中的元素可能是负数。这是一个例子:
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}