|
1 | 1 | class Solution {
|
2 |
| - public List<Integer> findClosestElements(int[] arr, int k, int x) { |
3 |
| - if (x <= arr[0]) { |
4 |
| - return Arrays.stream(arr).boxed().collect(Collectors.toList()).subList(0, k); |
5 |
| - } |
6 |
| - else if (x >= arr[arr.length - 1]) { |
7 |
| - return Arrays.stream(arr).boxed().collect(Collectors.toList()).subList(arr.length - k, arr.length); |
| 2 | + public List<Integer> findClosestElements(int[] arr, int k, int x) { |
| 3 | + if (k == 0 || arr.length == 0) { |
| 4 | + return new ArrayList<>(); |
| 5 | + } |
| 6 | + int[] diffArr = new int[arr.length]; |
| 7 | + int minDiff = Integer.MAX_VALUE; |
| 8 | + int minDiffIdx = -1; |
| 9 | + for (int i = 0; i < arr.length; i++) { |
| 10 | + diffArr[i] = Math.abs(arr[i] - x); |
| 11 | + if (minDiff > diffArr[i]) { |
| 12 | + minDiff = diffArr[i]; |
| 13 | + minDiffIdx = i; |
| 14 | + } |
| 15 | + } |
| 16 | + int left = minDiffIdx - 1; |
| 17 | + int right = minDiffIdx + 1; |
| 18 | + List<Integer> list = new ArrayList<>(); |
| 19 | + list.add(arr[minDiffIdx]); |
| 20 | + k--; |
| 21 | + while (k > 0) { |
| 22 | + if (left >= 0 && right < arr.length) { |
| 23 | + if (diffArr[left] <= diffArr[right]) { |
| 24 | + list.add(arr[left--]); |
8 | 25 | }
|
9 | 26 | else {
|
10 |
| - int idx = Arrays.binarySearch(arr, x); |
11 |
| - if (idx < 0) { |
12 |
| - idx = -idx - 1; |
13 |
| - } |
14 |
| - int low = Math.max(0, idx - k - 1); |
15 |
| - int high = Math.min(arr.length - 1, idx + k - 1); |
16 |
| - |
17 |
| - while (high - low > k - 1) { |
18 |
| - if (low < 0 || (x - arr[low]) <= (arr[high] - x)) { |
19 |
| - high--; |
20 |
| - } |
21 |
| - else if ((high > arr.length - 1 || (x - arr[low]) > (arr[high] - x))) { |
22 |
| - low++; |
23 |
| - } |
24 |
| - } |
25 |
| - |
26 |
| - return Arrays.stream(arr).boxed().collect(Collectors.toList()).subList(low, high + 1); |
| 27 | + list.add(arr[right++]); |
27 | 28 | }
|
| 29 | + } |
| 30 | + else if (left >= 0 && right == arr.length) { |
| 31 | + list.add(arr[left--]); |
| 32 | + } |
| 33 | + else { |
| 34 | + list.add(arr[right++]); |
| 35 | + } |
| 36 | + k--; |
28 | 37 | }
|
| 38 | + Collections.sort(list); |
| 39 | + return list; |
| 40 | + } |
29 | 41 | }
|
0 commit comments