public class Solution {
  public int[] kClosest(int[] array, int target, int k) {
    // Write your solution here
    int[] result = new int[k];
    if (array == null || array.length == 0) {
      return result;
    }
    if (k == 0) {
      return result;
    }
    int left = 0;
    int right = array.length - 1;
    int leftIndex = 0;
    while (left + 1 < right) {
      int mid = left + (right - left) / 2;
      if (array[mid] > target) {
        right = mid;
      } else {
        left = mid;
      }
    }
    if (array[right] <= target) {
        leftIndex = right;
    }
    if (array[left] <= target) {
        leftIndex = left;
    }
    int rightIndex = leftIndex + 1;
    for (int i = 0; i < k; i++) {
      if (rightIndex == array.length || leftIndex >= 0 && (target - array[leftIndex]) <= (array[rightIndex] - target)) {
       result[i] = array[leftIndex--];
      } else {
        result[i] = array[rightIndex++];
      }
    }
    return result;
  }
}

time: O(logn + k)

在给result 赋值的时候,注意左右边界 越界的问题。 要有条件,右边越界,或者左边不越界并且左边下标的值到target更近的情况 else 另一种情况。

results matching ""

    No results matching ""