美文网首页
LeetCode-658 找到 K 个最接近的元素

LeetCode-658 找到 K 个最接近的元素

作者: 阿凯被注册了 | 来源:发表于2021-08-09 11:56 被阅读0次

    原题链接:https://leetcode-cn.com/problems/find-k-closest-elements/solution/

    image.png

    解题思路:

    1. 滑动窗口长度为k,所以起点范围[0, n-k];
    2. 二分查找, 定义左右端点low, high;
    3. 计算中点mid,这个中点是我们的暂定起点p,我们将通过不断循环来更新这个mid最终找到p;
    4. 如果(x-arr[mid])<=(arr[mid+k]-x),说明x更靠近左边的元素,我们的框应该往左边找。比如: [1,1,1,1,1,9,9,9,9], x=3, k=5, arr[mid]=1, arr[mid+k]=9
    5. 如果(x-arr[mid])>(arr[mid+k]-x),说明x更靠近右边的元素,我们的框应该往右边找。比如: [1,1,1,1,1,9,9,9,9], x=8, k=5, arr[mid]=1, arr[mid+k]=9
      循环到底,最后的mid值就是框的起点.返回[mid:mid+k];

    Python3代码:

    class Solution:
        def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
            low, high = 0, len(arr)-k
            while low < high:
                mid = (low+high)//2
                if  x - arr[mid] <= arr[mid+k] - x: # 中间值更靠近左边
                    high = mid
                else: 
                    low = mid + 1
            return arr[low:low+k]
    

    相关文章

      网友评论

          本文标题:LeetCode-658 找到 K 个最接近的元素

          本文链接:https://www.haomeiwen.com/subject/qulzvltx.html