📅  最后修改于: 2023-12-03 14:57:35.078000             🧑  作者: Mango
给定一个整数数组和一个整数K,统计数组中差的绝对值可以被K整除的对数。
使用哈希表记录数组中每个元素出现的次数,遍历哈希表确定满足条件的数对。
具体实现:
遍历数组中的每个元素,计算其与K的余数,将余数作为键,元素个数作为值,存入哈希表中。
遍历哈希表中的每个键值对,如果键为0,说明可以与余数为0的元素组成数对,计算数对数量,并将哈希表中该键值对的值减1。
遍历哈希表中的每个键值对,如果键不为0,且对应的余数的补数在哈希表中存在,说明可以与余数为该键的元素组成数对,计算数对数量,并将哈希表中两个键值对的值都减1。
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
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实现。解题思路简单易懂,时间复杂度优秀,空间复杂度较高但可接受。