原题链接:https://leetcode-cn.com/problems/find-k-closest-elements/solution/
解题思路:
- 滑动窗口长度为k,所以起点范围[0, n-k];
- 二分查找, 定义左右端点low, high;
- 计算中点mid,这个中点是我们的暂定起点p,我们将通过不断循环来更新这个mid最终找到p;
- 如果(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
- 如果(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]