leetcode20220825每日一题 658找到K个最接近的元素

来源:力扣(LeetCode)
链接:658. 找到 K 个最接近的元素

题目描述如下:

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

  • |a - x| < |b - x| 或者
  • |a - x| == |b - x| 且 a < b 示例 1:
    输入:arr = [1,2,3,4,5], k = 4, x = 3
    输出:[1,2,3,4]

示例 2:
输入:arr = [1,2,3,4,5], k = 4, x = -1
输出:[1,2,3,4]

提示:

  • 1 <= k <= arr.length
  • 1 <= arr.length <= 104
  • arr 按 升序 排列
  • -104 <= arr[i], x <= 104

解题思路:

对数组arr中的数按到x的距离进行排序即可找到最近的K个元素

Java代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> result = new ArrayList<Integer>();
Integer[] tmp = new Integer[arr.length]; //存储arr中元素到x的距离,因为后续排序时使用了自定义的比较方法,故定义为Integer数组
for(int i=0;i<arr.length;i++){
tmp[i]=arr[i]-x;
}
Arrays.sort(tmp, (a,b) -> Math.abs(a)!=Math.abs(b)?Math.abs(a)-Math.abs(b):a-b);
for(int i=0;i<k;i++){
result.add(tmp[i]+x);
}
Collections.sort(result); //因为tmp是按到x的距离进行排序的,返回之前需要按数值大小再排序一次
return result;
}
}