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 另一种情况。