• 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;
        }
    };
    
  • 相关阅读:
    javascript DOM 操作
    遍历Map集合四中方法
    遍历List集合的三种方法
    Java中static关键字用法总结
    java中this关键字的作用
    深入理解Java的接口和抽象类
    MySQL查看所有用户及拥有权限
    MySQL新建用户,授权
    VMware Ubuntu如何连接互联网
    控件不接收用户交互的情况以及事件响应顺序
  • 原文地址:https://www.cnblogs.com/IzumiSagiri/p/15874655.html
Copyright © 2020-2023  润新知