658. Find K Closest Elements
這個題目是給定一個點 x
,要找出最接近的 k
個點,題目還有給另外一個條件,那就是如果有兩點距離相同的時候,要比較兩點的值,我們要取值小的座標。
乍看其實有點像是要使用 heap 來實作,但是這樣會發現一個問題,那就是如果有多個點距離一樣的時候,我們要怎麼去排序每個點的值,並且確保 heap 的結構?
通常使用 heap 來實作的題目,給定的陣列並不會排列好,因為我們就是需要 heap 來獲得 k
個最大值而不去真的排序,既然題目已經排序好了,就應該要善用這個值。
既然是排列好的情況,其實就可以知道最後的答案究竟是怎麼樣選擇的,例如:題目給定的值,比起陣列中所有的值都還小,那一定是陣列中最前面的幾個值最接近 x
,如果 x
比所有的數值都還大,那一定是選陣列最後的幾個,只有如果 x
的值剛好在陣列的最大最小值中間時需要考慮。
觀察出這樣的現象後,其實就可以繼續實作這個題目的要求,透過 binary search 的方式,來找到題目所求的區間。
class Solution:
def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
left = 0
right = len(arr) - 1
#
if x <= arr[left]:
return arr[:k]
elif x >= arr[right]:
return arr[right-k+1:]
else:
while right - left + 1 > k:
if abs(arr[left] - x) > abs(arr[right] - x):
left += 1
else:
right -= 1
return arr[left:left+k]