这个答案最经典,且好理解
- 链接中给出的模型代码分两步:中间值计算,check函数判断满足条件与否,这种模型代码思路间接,感觉更好理解
- 每次都用 L< R这种思路也比较好
力扣https://leetcode-cn.com/problems/find-k-th-smallest-pair-distance/solution/chi-tou-er-fen-fa-xi-lie-cong-ru-men-dao-2eh6/
总结
- 稍微复杂点的题目不会简单的一个二分模板代码套用就能解出来
- 题目的核心思想还是二分法
- 需要将目标问题转换可以二分的模型,此题中将距离作为二分查找的目标模型,且判断是否找到的条件也不是简单的判断是否相等,是判断距离小于target的个数;这一层转换是关键中的关键,如果没明白也就无从下手
- 首先要对数组排序,有了排序才能想到第3步中的模型转换,这种排序一般用库函数直接排
package com.company.binarySearch;
import java.util.Arrays;
public class Solution9 {
public int smallestDistancePair(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length;
int l = 0, r = nums[n - 1] - nums[0];
int ans = 0;
while (l <= r) {
int mid = l + (r - l) / 2;
if (check(mid, nums, k)) {
ans = mid; // 记录当前最小合法距离
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}
boolean check(int dist, int[] nums, int k) {
int n = nums.length, j = 1;
int cnt = 0; // 记录小于等于当前构造解 dist 的距离对数量
for (int i = 0; i < n; i++) {
while (j < n && nums[j] <= nums[i] + dist) j++;
cnt += j - i - 1; // 处于 [i + 1, j] 中的数与 a[i]的距离均小于 dist
}
return cnt >= k;
}
}