【问题标题】:Count all sub-arrays having sum divisible by k计算总和可被 k 整除的所有子数组
【发布时间】: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 

首先,我不明白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)% kth 数组的数量有什么作用?

如果这可以很容易地逐步解释,那就太好了。谢谢。

【问题讨论】:

    标签: python algorithm


    【解决方案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...

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2012-07-31
      • 2012-10-16
      • 2013-05-12
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多