# Time:  O(logn + k)
# Space: O(1)

# Given a sorted array, two integers k and x, find the k closest elements to x in the array.
# The result should also be sorted in ascending order.
# If there is a tie, the smaller elements are always preferred.
#
# Example 1:
# Input: [1,2,3,4,5], k=4, x=3
# Output: [1,2,3,4]
# Example 2:
# Input: [1,2,3,4,5], k=4, x=-1
# Output: [1,2,3,4]
# Note:
# The value k is positive and will always be smaller than the length of the sorted array.
# Length of the given array is positive and will not exceed 10^4
# Absolute value of elements in the array and x will not exceed 10^4

class Solution(object):
    def findClosestElements(self, arr, k, x):
        """
        :type arr: List[int]
        :type k: int
        :type x: int
        :rtype: List[int]
        """
        i = bisect.bisect_left(arr, x)
        left, right = i-1, i
        while k:
            if right >= len(arr) or \
               (left >= 0 and abs(arr[left]-x) <= abs(arr[right]-x)):
                left -= 1
            else:
                right += 1
            k -= 1
        return arr[left+1:right]

# Time:  O(logn + k)
# Space: O(1)

# Given a sorted array, two integers k and x, find the k closest elements to x in the array.
# The result should also be sorted in ascending order.
# If there is a tie, the smaller elements are always preferred.
#
# Example 1:
# Input: [1,2,3,4,5], k=4, x=3
# Output: [1,2,3,4]
# Example 2:
# Input: [1,2,3,4,5], k=4, x=-1
# Output: [1,2,3,4]
# Note:
# The value k is positive and will always be smaller than the length of the sorted array.
# Length of the given array is positive and will not exceed 10^4
# Absolute value of elements in the array and x will not exceed 10^4

class Solution(object):
    def findClosestElements(self, arr, k, x):
        """
        :type arr: List[int]
        :type k: int
        :type x: int
        :rtype: List[int]
        """
        i = bisect.bisect_left(arr, x)
        left, right = i-1, i
        while k:
            if right >= len(arr) or \
               (left >= 0 and abs(arr[left]-x) <= abs(arr[right]-x)):
                left -= 1
            else:
                right += 1
            k -= 1
        return arr[left+1:right]

# Time:  O(logn + k) # Space: O(1) # Given a sorted array, two integers k and x, find the k closest elements to x in the array. # The result should also be sorted in ascending order. # If there is a tie, the smaller elements are always preferred. # # Example 1: # Input: [1,2,3,4,5], k=4, x=3 # Output: [1,2,3,4] # Example 2: # Input: [1,2,3,4,5], k=4, x=-1 # Output: [1,2,3,4] # Note: # The value k is positive and will always be smaller than the length of the sorted array. # Length of the given array is positive and will not exceed 10^4 # Absolute value of elements in the array and x will not exceed 10^4 :type arr: List[int]         :type k: int         :type x: int         :rtype: List[int]