Solution1 前缀和 + hash + 同余

  • 时间复杂度 O(n)

  • 空间复杂度 O(n)

直接暴力双重循环的话会超时

假设我们的目标区间是 [i, j]

presum[j] - presum[i-1] = n * k 其中 n 为整数

变形

(presum[j] / k) - (presum[i-1] / k) = n

要使两者除 k 相减为整数,则需要 presum[j] 和 presum[i-1] 对 k 的余数相同

解释:

假设: sum[i] = k a + b sum[j] = k c + d 那么:sum[i] - sum[j] = (k a + b) - (k c + d) = k * (a - c) + (b - d) 要使 (sum[i] - sum[j]) 是 k 的整数倍,就要使 b - d = 0, 即 sum[i] 与 sum[j] 除 k 余数相同

Last updated