给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。
整数 a 比整数 b 更接近 x 需要满足:
|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b
思路:
因为是排序好的数组,所以k个数一定是长度为k的连续子数组,只需要找出这个子数组的起点即可。起点可以使用二分查找。
class Solution:
def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
n = len(arr)
left = 0
#起点不会在right之后
right = n-k
while left<right:
mid = (left+right)//2
if x-arr[mid]<=arr[mid+k]-x:#注意要将终点后一个元素与起点元素进行判断,因为大小相同时,取值较小的
right=mid
else:
left=mid+1
return arr[left:left+k]