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

原题链接: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 个最接近的元素)