658. Find K Closest Elements

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]