📌  相关文章
📜  对数组中的对进行计数,其和可被K整除(1)

📅  最后修改于: 2023-12-03 15:09:28.892000             🧑  作者: Mango

题目介绍

这是一道关于数组计数的问题,我们要求对数组中的对进行计数,使得这些对的和能够被K整除。例如数组[4,5,0,-2,-3,1],如果K为5,则符合条件的对有(4,5)和(0,5)。本题需要你设计一个算法,以在O(N)时间内完成寻找。下面我们将逐步讲解如何实现。

解法思路

我们可以使用哈希表完成对数组进行计数。假设当前我们正在迭代到第i个数,我们需要找到能够和这个数形成一个整除K的对的数。一种暴力的方式是遍历i+1到末尾的所有数,寻找那些能够满足条件的数,但是这种做法是O(N^2)时间复杂度的。我们可以换个思路:如果当前i号数模K的余数是X,我们需要查找的是一个模K余数为(K-X)%K的数,我们可以将所有模K余数为X的数进行哈希,然后在哈希表里查找是否有那些余数为(K-X)%K的数,并将全部计入答案。

举个例子,假设当前K=5,数组[4,5,0,-2,-3,1]。对于第一个数4,它的模5余数是4,那么能够和它形成整除5的数,应该是模5余数为1的数。我们将所有模5余数为4的数都放入哈希表里,接下来再计算出模5余数为1的数,将答案累加就可以了。重要的是,这里K-X可能为0,因此我们需要特判一下,只计算哈希表中存在的数,而不是把i号数也计入答案。

代码如下:

def countPairs(nums: List[int], k: int) -> int:
    count = collections.defaultdict(int)
    ans = 0
    for x in nums:
        mod_x = x % k
        if count[mod_x]:
            ans += count[mod_x]
        count[(k - mod_x) % k] += 1
    return ans

总结

本题可以用哈希表来完成O(N)时间复杂度的计算,采用模K的余数来进行哈希表的构建,能够轻松的寻找余数为(K-X)%K的目标数,并作为计算的依据。总的来说这是一道不错的算法题,值得我们去品味。