Find K Closest Elements
Given a target number, a non-negative integer k and an integer array A sorted in ascending order,
find the k closest numbers to target in A,
sorted in ascending order by the difference between the number and target.
Otherwise, sorted in ascending order by number if the difference is same.
Example
Given A = [1, 2, 3], target = 2 and k = 3, return [2, 1, 3].
Given A = [1, 4, 6, 8], target = 3 and k = 3, return [4, 1, 6].
Challenge
O(logn + k) time complexity.
Notice
The value k is a non-negative integer 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
思路
- 找到最近接的两个,其中一个可以等于target
- 然后两根指针比较,左边的左移,右边的右移,注意左右不要越界,如果左边到达了0,那么就全部添加右边的,反之一样
public class Solution {
public int[] kClosestNumbers(int[] A, int target, int k) {
if (A.length == 0) {
return new int[0];
}
int[] result = new int[k];
int start = 0;
int end = A.length - 1;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (A[mid] > target) {
end = mid;
} else {
start = mid;
}
}
for (int i = 0; i < k; i++) {
if (start < 0) {
result[i] = A[end];
end++;
continue;
}
if (end > A.length - 1) {
result[i] = A[start];
start--;
continue;
}
if (Math.abs(A[start] - target) <= Math.abs(A[end] - target)) {
result[i] = A[start];
start--;
} else {
result[i] = A[end];
end++;
}
}
return result;
}
}