【LeetCode】数组中的 k-diff 数对Java题解

92 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

题目描述

给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件:

0 <= i, j < nums.length i != j

|nums[i] - nums[j]| == k 注意,|val| 表示 val 的绝对值。


示例 1:

输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个 1 ,但我们只应返回不同的数对的数量。
示例 2:

输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5) 。
示例 3:

输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1) 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/k-diff-pairs-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组题目,题目自定义了k-diff 数对,需要满足0 <= i, j < nums.length i != j,|nums[i] - nums[j]| == k。
  • 根据上述条件,我们无须对数组排序。在求 k-diff 数组的过程中,|nums[i] - nums[j]| == k 转换成两数之和的题目,求解思路类似,为了避免重复,我们使用 hashSet 记录访问过的元素。实现代码如下,供参考。

通过代码

class Solution {
    public int findPairs(int[] nums, int k) {
        Set<Integer> visited = new HashSet<Integer>();
        Set<Integer> res = new HashSet<Integer>();
        for (int num : nums) {
            if (visited.contains(num - k)) {
                res.add(num - k);
            }
            if (visited.contains(num + k)) {
                res.add(num);
            }
            visited.add(num);
        }
        return res.size();
    }
}

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)。
  • HashSet 和 HashMap 都是我们常用的 Hash 结构, 两者常常拿来一起比较,其中HashMap实现了Map接口,存储的是键值对。HashSet实现了set接口,存储的是对象。我们要区分清楚,灵活使用。
  • 坚持算法每日一题,加油!