持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
题目详情
LeetCode题库序号 532. 找出第 K 小的数对距离 ,难度为 中等。
Tag : 「排序」,「二分查找」,「哈希表」
给定一个整数数组和一个整数 ,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
这里将 k-diff 数对定义为一个整数对 ,并满足下述全部条件:
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,最后累加这些数量即可完成。
题解代码
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/… 。