刷完LeetCode题库——532. 数组中的 k-diff 数对

94 阅读1分钟

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

题目详情

LeetCode题库序号 532. 找出第 K 小的数对距离 ,难度为 中等

Tag : 「排序」,「二分查找」,「哈希表」

给定一个整数数组和一个整数 kk,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

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

  • 0 <= i < j < nums.length
  • |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)。

提示:

  • 1<=nums.length<=1041 <= nums.length <= 10^4
  • 107<=nums[i]<=107-10^7 <= nums[i] <= 10^7
  • 0<=k<=1070 <= k <= 10^7

排序 + 二分查找 + 哈希表

题解思路:

首先我们要明确题目的要求,题目中只需要返回唯一的数对,只要数对中的两个数字相同,那就代表它们是相同的数对,我们第一步对数组进行排序,我们需要使用哈希表来存储之前查找过的数对,防止重复查找,在查找的过程中我们使用右端点的形式出发,进行二分查找,找到我们需要的值后,返回数量1,最后累加这些数量即可完成。

题解代码

public class Solution {
    public int findPairs(int[] nums, int k) {
        int ans = 0;
        Arrays.sort(nums);
        int n = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int j = 0; j < n; j++) {
            ans += binarySearch(map, nums, j, nums[j] - k);
        }
        return ans;
    }

    public int binarySearch(Map<Integer, Integer> map, int[] nums, int end, int target) {
        int ans = 0;

        int left = 0;
        int right = end;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (mid != end && nums[mid] == target) {
                Integer integer = map.get(target);
                if (integer == null) {
                    ans = 1;
                    map.put(target, end);
                }
                break;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }


        return ans;
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.532 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…