Given a sorted array, two integers k
and x
, find the k
closest elements to x
in the array. The result should also be sorted in ascending order. If there is a tie, the smaller elements are always preferred.
Example 1:
Input: [1,2,3,4,5], k=4, x=3
Output: [1,2,3,4]
Example 2:
Input: [1,2,3,4,5], k=4, x=-1
Output: [1,2,3,4]
Note:
- The value k is positive and will always be smaller than the length of the sorted array.
- Length of the given array is positive and will not exceed 104
- Absolute value of elements in the array and x will not exceed 104
UPDATE (2017/9/19):
The arr parameter had been changed to an array of integers (instead of a list of integers). Please reload the code definition to get the latest changes.
思路:
一:通过二分搜索找到数组中小于等于x的最大位置index
二:从index处开始展开,按左右两边对index位置差值的大小展开,直到找到k个数
程序如下所示:
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> list = new ArrayList<>();
if (arr.length == 0){
return list;
}
int index = getIndex(arr, x);
int i = index, j = index;
while(k > 1) {
if(i == 0) {
j++;
} else if(j == arr.length - 1) {
i--;
} else if( Math.abs(arr[i-1] - x) <= Math.abs(arr[j+1] - x)) {
i--;
} else {
j++;
}
k--;
}
for (int t = i; t <= j; ++ t){
list.add(arr[t]);
}
return list;
}
public int getIndex(int[] arr, int target){
int left = 0, right = arr.length - 1;
while (left < right){
int mid = left + ((right - left) >> 1);
if (arr[mid] == target){
return mid;
}
else if (arr[mid] > target){
right = mid - 1;
}
else {
left = mid + 1;
}
}
return left;
}
}