题目链接:LeetCode 2006 差的绝对值为K的数对数目
题目大意:
给你一个整数数组\(nums\)和一个整数\(k\),请你返回数对\((i, j)\)的数目,满足\(i < j\)且\(\begin{vmatrix}nums[i]-nums[j]\end{vmatrix}=k\)。
题解:
暴力
我们可以使用两层循环,一层遍历\(i\),一层遍历\(j\),对每个\((i,j)\)的组合,判断差的绝对值是否为\(k\),统计所有符合条件的数对。
class Solution {
public:
int countKDifference(vector<int>& nums, int k) {
int ans = 0, n = nums.size();
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (abs(nums[i] - nums[j]) == k) {
ans++;
}
}
}
return ans;
}
};
哈希
我们进行一次遍历,遍历时下标代表\(j\)。对每一个\(j\),我们需要知道在这个\(j\)之前的符合条件的\(i\)的个数,即满足\(\begin{vmatrix}nums[i]-nums[j]\end{vmatrix}=k\)的\(i\)的个数,亦即满足\(nums[i]=nums[j]+k\)或\(nums[i]=nums[j]−k\)的\(i\)的个数。使用哈希表可以在\(O(1)\)的时间内统计出这样的个数,因此在遍历时我们可以使用一个哈希表来维护不同数值的频率,并统计符合条件的数对总数。
class Solution {
public:
int countKDifference(vector<int>& nums, int k) {
int ans = 0, n = nums.size();
unordered_map<int, int> hashTable;
for (auto& num : nums) {
ans += hashTable.count(num + k) ? hashTable[num + k] : 0;
ans += hashTable.count(num - k) ? hashTable[num - k] : 0;
hashTable[num]++;
}
return ans;
}
};