LeetCode.M658
题目:
题目大意:
给定一个升序数组arr,两个整数 k 和 x ,找出距离 x 最近(与x的差的绝对值最小)的 k 个数。保证这些数尽量靠前。
数据范围:
如图所示
思路:
[二分] ,找出 x 在 arr 中 的位置idx,如果 x 在 arr 中 不存在,则找出如果 x 插入到 arr 中的位置,这个位置 idx 可使用二分直接得到。然后就是寻找 k 个数,模拟找出左边界和右边界,然后将这个区间中的数加入ans中。
代码:
import java.util.ArrayList;
import java.util.List;
class Solution {
public int getIdx(int[] arr, int x){
int l = 0, r = arr.length - 1;
while (l < r){
int mid = l + r >> 1;
if (arr[mid] >= x)
r = mid;
else
l = mid + 1;
}
return l;
}
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int idx = getIdx(arr, x), inf = (int) 1e5;
List<Integer> ans = new ArrayList<>();
int l = idx - 1, r = idx;
while (k -- > 0){
int a = l >= 0 ? x - arr[l] : inf;
int b = r <= arr.length - 1 ? arr[r] - x : inf;
if (a > b){
r ++ ;
}else {
l -- ;
}
}
for (int i = l + 1; i <= r - 1; i ++ )
ans.add(arr[i]);
return ans;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
int[] arr = new int[]{1,2,3,4,5};
System.out.println(solution.findClosestElements(arr, 4, -1).toString());
}
}
时空复杂度分析等:
-
时间复杂度 : O(logn + k)
-
空间复杂度 : O(1)