LeetCode-532. 数组中的 k-diff 数对

    科技2022-07-11  93

    难度:【中等】

    给定一个整数数组和一个整数 k,你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j),其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k 。

    示例:

    示例 1:

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

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

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

    输入:nums = [1,2,4,4,3,3,0,9,2,3], k = 3 输出:2 示例 5:

    输入:nums = [-1,-2,-3], k = 1 输出:2

    提示:

    1 <= nums.length <= 104-107 <= nums[i] <= 1070 <= k <= 107

    解题思路:

    方法1:排序+双指针+HashSet

    先排序,再使用双指针依次判断两数之差和K的关系,并使用hashset去重即可

    代码实现:

    class Solution { public int findPairs(int[] nums, int k) { Arrays.sort(nums); int i = 0,j = 1; Set<Integer> set1 = new HashSet<>(); Set<Integer> set2 = new HashSet<>(); int count = 0; while(j < nums.length && i < j) { int diff = nums[j] - nums[i]; if (diff < k) { j++; }else if(diff > k) { i++; if (i == j) j++; }else { if (!set1.contains(nums[i]) && !set2.contains(nums[j])) { count++; set1.add(nums[i]); set2.add(nums[j]); } i++; j++; } } return count; } }

    方法2:HashMap

    先使用哈希表存储所有数及其出现次数。

    如果k等于0,直接统计出现次数大于1的数的个数即可。否则,判断每个数 num 是否存在对应的 num + k 即可。

    代码实现:

    class Solution { public int findPairs(int[] nums, int k) { if (k < 0) { return 0; } int count = 0; Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { map.put(num, map.getOrDefault(num,0)+1); } if (k == 0) { for (int num : map.keySet()) { if (map.get(num) > 1) { count++; } } } else { for (int num : map.keySet()) { if (map.containsKey(num + k)) { count++; } } } return count; } }
    Processed: 0.009, SQL: 8