460. find k closest elements

explanation

  1. Using binary search to find Closest element
  2. Use two pointers to find k Closest elements

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class  {

* @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 || k == 0) {
return new int[0];
}
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;
}
}
// find the range of target
/*
如果target out of range, 一边的point不会动。
*/

int[] result = new int[k];
int count = 0;
while (start >= 0 && end <= A.length - 1 && count < k) {
// start更接近target
if (Math.abs(A[start] - target) <= Math.abs(A[end] - target)) {
result[count] = A[start];
start--;
} else {
result[count] = A[end];
end++;
}
count++;
}
// count 有可能没有填满
while (count < k && start >= 0) {
result[count] = A[start];
count++;
start--;
}
while (count < k && end <= A.length - 1) {
result[count] = A[end];
count++;
end++;
}
return result;

}
}

complexity

  1. time: O(log(n) + k)
  2. space: O(k)