zoukankan      html  css  js  c++  java
  • Leetcode658题找到k个最接近的数

    题目

    给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

    输入: [1,2,3,4,5], k=4, x=3
    输出: [1,2,3,4]
    
    k 的值为正数,且总是小于给定排序数组的长度。
    数组不为空,且长度不超过 104
    数组里的每个元素与 x 的绝对值不超过 104

    题解

    下面参考图片来源于leetcode题解区。本题采用二分查找法进行求解,如下图所示,二分过程中,需要找到离目标x最近的数以判断出连续的起始区间,本题最终结果让二分后的left作为最终返回子数组开始点,所以在二分过程中当x靠mid更近时,继续从左边的子数组查找起始left。

    class Solution {
        public List<Integer> findClosestElements(int[] arr, int k, int x) {
            int left = 0;
            int right = arr.length - k;
            while(left < right){
                int mid = left + (right - left) / 2;
                if(x - arr[mid] > arr[mid + k] - x){    
                    left = mid + 1;
                }
                else{
                    right = mid;    //因为最后返回的是left开始的子数组,所以这里找返回数组的起始点是继续从左边开始找
                }
            }
            List<Integer> result = new ArrayList<>();
            for(int i = left; i < left + k; ++i){
                result.add(arr[i]);
            }
            return result;
        }
    }

     参考:https://leetcode-cn.com/problems/find-k-closest-elements/solution/pai-chu-fa-shuang-zhi-zhen-er-fen-fa-python-dai-ma/

  • 相关阅读:

    (luogu)[模板]最长公共子序列
    表达式的值
    邮票面值设计
    尼克的任务
    HISTOGRA
    消防局的设立
    青蛙的约会
    产生数
    奇怪的电梯
  • 原文地址:https://www.cnblogs.com/jianglinliu/p/11813624.html
Copyright © 2011-2022 走看看