LeetCode 2006 差的绝对值为K的数对数目

题目链接: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;
    }
};
posted @ 2022-02-09 13:46  ZZHHOOUU  阅读(60)  评论(0编辑  收藏  举报