题目:最接近的k个数:给定一个目标数target,一个非负整数k,一个按照升序排列的数组A,在A中找出与target最接近的k个整数,返回这k个数并按照与target的接近程度从小到大排序,如果接近程度相当,那么值小的排在前面
class Solution:
def kClosestNumbers(self,A,target,k):
#找到A[left]<target,A[right]>=target
#最接近target的两个数,肯定是相邻的
right = self.find_upper_closest(A,target)
left = right -1
#两个指针从中间往两边扩展,依次找到最接近k个数
results = []
for _ in range(k):
if self.is_left_closer(A,target,left,right):
results.append(A[left])
left -= 1
else:
results.append(A[right])
right += 1
return results
def find_upper_closest(self,A,target):
#找到A中第一个大于等于target的数字
start,end = 0,len(A) -1
while start +1 < end:
mid = (start + end) //2
if A[mid] >= target:
end = mid
else:
start = mid
if A[start] >= target:
return start
if A[end] >= target:
return end
return end +1
def is_left_closer(self,A,target,left,right):
if left <0:
return False
if right >= len(A):
return True
return target - A[left] <= A[right] - target