LC 0658 [M] Find K Closest Elements - ALawliet/algorithms GitHub Wiki

first binary search

x - A[mid] <= A[mid + k] - x, need to move window go left (r = m)
case 1: outside left
-------(x)----A[mid]-----------------A[mid + k]----------

case 2: inside left is smaller:
-------A[mid]----(x)-----------------A[mid + k]----------

*** x - A[mid] > A[mid + k] - x, need to move window go right *** (l = m + 1)
case 3: inside left
-------A[mid]------------------(x)---A[mid + k]----------

case 4: outside right
-------A[mid]---------------------A[mid + k]----(x)------

since k < len(A) we can use len(A) - k as max search space

class Solution:
    def findClosestElements(self, A: List[int], k: int, x: int) -> List[int]:
        l = 0
        r = len(A) - k
        while l < r:
            m = (l + r) // 2
            dist_x_to_l = x - A[m]
            dist_r_to_x = A[m+k] - x
            if dist_x_to_l > dist_r_to_x:
                l = m + 1
            else:
                r = m
        return A[l:l+k]
class Solution:
    def findClosestElements(self, A: List[int], k: int, x: int) -> List[int]:
        l = 0
        r = len(A) - k
        while l < r:
            m = (l + r) // 2
            dist_l_to_x = abs(A[m] - x)
            dist_r_to_x = A[m+k] - x
            if dist_l_to_x > dist_r_to_x:
                l = m + 1
            else:
                r = m
        return A[l:l+k]