📌  相关文章
📜  计算绝对差可被 K 整除的数组中的对(1)

📅  最后修改于: 2023-12-03 14:57:35.078000             🧑  作者: Mango

题目简介

给定一个整数数组和一个整数K,统计数组中差的绝对值可以被K整除的对数。

解题思路

使用哈希表记录数组中每个元素出现的次数,遍历哈希表确定满足条件的数对。

具体实现:

  • 遍历数组中的每个元素,计算其与K的余数,将余数作为键,元素个数作为值,存入哈希表中。

  • 遍历哈希表中的每个键值对,如果键为0,说明可以与余数为0的元素组成数对,计算数对数量,并将哈希表中该键值对的值减1。

  • 遍历哈希表中的每个键值对,如果键不为0,且对应的余数的补数在哈希表中存在,说明可以与余数为该键的元素组成数对,计算数对数量,并将哈希表中两个键值对的值都减1。

代码实现

Python
def count_pairs(arr, k):
    count = 0
    rem_map = {}
    for num in arr:
        rem = num % k
        if rem in rem_map:
            rem_map[rem] += 1
        else:
            rem_map[rem] = 1
        
    for rem, freq in rem_map.items():
        if rem == 0:
            count += freq * (freq - 1) // 2
            rem_map[rem] = 0
        elif k - rem in rem_map:
            count += freq * rem_map[k - rem]
            rem_map[rem] = 0
            rem_map[k - rem] = 0
    
    return count
C++
int countPairs(vector<int>& arr, int k) {
    int count = 0;
    unordered_map<int, int> rem_map;
    for (int num : arr) {
        int rem = num % k;
        if (rem_map.count(rem)) {
            rem_map[rem]++;
        } else {
            rem_map[rem] = 1;
        }
    }
    for (auto it = rem_map.begin(); it != rem_map.end(); it++) {
        int rem = it->first, freq = it->second;
        if (rem == 0) {
            count += freq * (freq - 1) / 2;
            it->second = 0;
        } else if (rem_map.count(k - rem)) {
            count += freq * rem_map[k - rem];
            it->second = 0;
            rem_map[k - rem] = 0;
        }
    }
    return count;
}

时间复杂度分析

使用哈希表记录每个元素的余数,时间复杂度为O(n);遍历哈希表,计算数对数量,时间复杂度为O(n);因此,总时间复杂度为O(n)。

空间复杂度分析

使用哈希表记录每个元素的余数及其出现次数,空间复杂度为O(n)。

总结

本题可以使用哈希表(即字典)统计元素的出现次数,非常适合使用Python或C++的STL实现。解题思路简单易懂,时间复杂度优秀,空间复杂度较高但可接受。