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;
}