在研究面试时,我在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是一个 因此,商和雷姆是余数。
sum(i, j) = (q1 * k + rem1) - (q2 * k + rem2)
sum(i, j) = (q1 - q2)k + rem1-rem2
我们看到,对于sum(i,j),即任何子数组的和为 RHS还可以被k整除。 对于(rem1-rem2),(q1-q2)k显然可以被k整除。 遵循相同,rem1 = rem2其中
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)% k
个数组的坐标有什么作用?
如果可以轻松地逐步解释,那就太好了。谢谢。
答案 0 :(得分:1)
您熟悉整数模/余数运算吗?
7 modulo 3 = 1 because
7 = 2 * 3 + 1
compare
N % M = r
because N might be represented as
N = q * M + r
here r is remainder and q is result of integer division like
7 // 3 = 2
对于模k
,可能有k
个余数0..k-1
mod
数组包含每个可能余数的计数器。计算每个子范围总和的余数时,相应的计数器就会增加,因此生成的mod
数组数据看起来像[3,2,5,0,7]
的三个零余数,两个余数等于1 ...