0
点赞
收藏
分享

微信扫一扫

719. 找出第 k 小的距离对 - [ 困难] -[二分的转换]

星巢文化 2022-04-06 阅读 43
leetcode

这个答案最经典,且好理解 

  • 链接中给出的模型代码分两步:中间值计算,check函数判断满足条件与否,这种模型代码思路间接,感觉更好理解
  • 每次都用 L< R这种思路也比较好

力扣icon-default.png?t=M276https://leetcode-cn.com/problems/find-k-th-smallest-pair-distance/solution/chi-tou-er-fen-fa-xi-lie-cong-ru-men-dao-2eh6/

总结

  1. 稍微复杂点的题目不会简单的一个二分模板代码套用就能解出来
  2. 题目的核心思想还是二分法
  3. 需要将目标问题转换可以二分的模型,此题中将距离作为二分查找的目标模型,且判断是否找到的条件也不是简单的判断是否相等,是判断距离小于target的个数;这一层转换是关键中的关键,如果没明白也就无从下手
  4. 首先要对数组排序,有了排序才能想到第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;
    }

}
举报

相关推荐

0 条评论