public int[] kClosestNumbers(int[] A, int target, int k) {
      int[] res = new int[k];
      if (A == null || k > A.length) {
            return A;
        }

      int firstIndex = firstIndex(A, target);
      int start = firstIndex - 1;
      int end   = firstIndex;

      for (int i = 0; i < k; i++) {
          if (end >= A.length) {
              res[i] = A[start--];
          } else if (start < 0) {
              res[i] = A[end++];
          } else {
              if (target - A[start] <= A[end] - target) {
                  res[i] =  A[start--];
              } else {
                  res[i] =  A[end++];
              }
          }
      }
        return res;
    }
    private int firstIndex(int[] A, int target) {
        int start = 0, end = A.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (A[mid] < target) {
                start = mid;
            } else {
                end = mid;
            }
        }

        if (A[start] >= target) {
            return start;
        }
        if (A[end] >= target) {
            return end;
        }
        return A.length;
    }

results matching ""

    No results matching ""