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]
.
因为是已经拍好序得数组了,因此可以使用二分法来降低时间复杂度,但是要注意后面的自然顺序排序。
java
public class Solution {
/*
* @param A: an integer array
* @param target: An integer
* @param k: An integer
* @return: an integer array
*/
public int[] kClosestNumbers(int[] A, int target, int k) {
// write your code here
if (A == null || A.length == 0) {
return new int[]{};
}
int index = findIndex(A, target);
int start = index - 1;
int end = index;
int[] res = new int[k];
for (int i = 0; i < k; i++) {
if (start < 0) {
res[i] = A[end++];
} else if (end >= A.length) {
res[i] = A[start--];
} else {
int diff1 = Math.abs(A[start] - target);
int diff2 = Math.abs(A[end] - target);
if (diff1 <= diff2) {
res[i] = A[start--];
} else {
res[i] = A[end++];
}
}
}
return res;
}
private int findIndex(int[] A, int target) {
int start = 0;
int end = A.length - 1;
int mid = 0;
while (start + 1 < end) {
mid = (end - start) / 2 + start;
if (A[mid] >= target) {
end = mid;
} else {
start = mid;
}
}
return Math.abs(A[start] - target) < Math.abs(A[end] - target) ?
start : end;
}
}