zoukankan      html  css  js  c++  java
  • LeetCode719. 找出第 k 小的距离对

    ☆☆☆☆☆(不是很理解....太绕了 T_T)

    思路:二分 + 双指针。题目要求第K个最小距离,所以如果我们有一个有序数组记录着所有可能的最小距离,那么问题就可以变成一个最简单的二分法求解了

      本题的难点在于二分查找的不是某个数,而是两个数的差值(即距离)。需要使用双指针来计算出所有小于等于mid的距离对数目。

    class Solution {
        public int smallestDistancePair(int[] nums, int k) {
            /**
             *  思路:分两步求解,第一步 理清楚二分; 第二步 双指针计算出所有小于等于mid的距离对数目
             */
            Arrays.sort(nums);
            int len = nums.length;
            int low = 0, high = nums[len - 1] - nums[0];
            // 第 k 小的距离一定在最小距离 和 最大距离之间。
            while (low < high) {
                int mid = low + ((high - low) >> 1);
                int count = 0; // 记录所有<= mid 的距离对数目。
                int left = 0;
                for (int right = 0; right < len; right++) {
                    while (nums[right] - nums[left] > mid) left ++;
                    count += right - left;
                }
                if (count < k) {   //整个数列中比mid小的数列对的数量小于k个
                    low = mid + 1; // 则第k个最小距离不会在[l,mid]之间,故修改l=mid+1;
                }else {
                    high = mid;
                }
            }
            return low;
        }
    }

    参考:

    动用「二分查找模板」来巧妙解决此题

  • 相关阅读:
    预备作业03 20162308马平川
    预备作业02 20162308 马平川
    预备作业01
    采用dlopen、dlsym、dlclose加载动态链接库
    FastCGI协议分析
    Fastcgi协议定义解释与说明
    linux exec函数族
    进程通信---FIFO
    FTP协议及工作原理详解
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14117577.html
Copyright © 2011-2022 走看看