【发布时间】:2018-11-28 06:41:10
【问题描述】:
在准备面试的时候,在GeeksForGeeks上找到了这个问题和解决方案,但是不明白解决方案。
它说的是
Let there be a subarray (i, j) whose sum is divisible by k
sum(i, j) = sum(0, j) - sum(0, i-1)
任何子数组的总和可以写成 q*k + rem 其中 q 是 商和rem是余数因此,
sum(i, j) = (q1 * k + rem1) - (q2 * k + rem2)
sum(i, j) = (q1 - q2)k + rem1-rem2
我们看到,对于 sum(i, j) 即任何子数组的总和是 能被 k 整除,RHS 也应该能被 k 整除。 (q1 - q2)k 显然可以被 k 整除,因为 (rem1-rem2) 为 同理,rem1 = rem2 where
rem1 = Sum of subarray (0, j) % k
rem2 = Sum of subarray (0, i-1) % k
首先,我不明白q1 和q2 表示什么。
def subCount(arr, n, k):
# create auxiliary hash
# array to count frequency
# of remainders
mod =[]
for i in range(k + 1):
mod.append(0)
cumSum = 0
for i in range(n):
cumSum = cumSum + arr[i]
mod[((cumSum % k)+k)% k]= mod[((cumSum % k)+k)% k] + 1
result = 0 # Initialize result
# Traverse mod[]
for i in range(k):
if (mod[i] > 1):
result = result + (mod[i]*(mod[i]-1))//2
result = result + mod[0]
return result
在这个解决方案代码中,我没有得到mod 的角色。增加((cumSum % k)+k)% kth 数组的数量有什么作用?
如果这可以很容易地逐步解释,那就太好了。谢谢。
【问题讨论】: