计算总和可被k

时间:2018-11-28 06:41:11

标签: python algorithm

在研究面试时,我在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 

首先,我不明白q1q2的含义。

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个数组的坐标有什么作用?

如果可以轻松地逐步解释,那就太好了。谢谢。

1 个答案:

答案 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 ...