给定一个排序好的数组 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
- 数组里的每个元素与
x
的绝对值不超过104
----
解题思路 1、计算int[] arr中各元素与x的差绝对值保存在int[] diff中; 2、排序int[] diff; 3、取int[] diff中的前k个元素,依次与int[] arr中各元素与x的差绝对值比较,相等则加入输出列表,直到列表长度达到k。
代码
package Solution658;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
class Solution4 {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> out = new ArrayList<Integer>();
int[] diff = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
diff[i] = Math.abs(arr[i] - x);
}
Arrays.sort(diff);
// System.out.println(Arrays.toString(diff));
for (int j = 0; j < k; j++) {
for (int i = 0; i < arr.length; i++) {
if (Math.abs(arr[i] - x) == diff[j]) {
// System.out.println(diff[j]);
if (out.size() < k) {
out.add(arr[i]);
arr[i] = Integer.MAX_VALUE;
}
}
}
}
Collections.sort(out);
return out;
}
public static void main(String[] args) {
Solution4 sol = new Solution4();
int[] arr = { 1, 1, 2, 2, 2, 2, 2, 3, 3 };
int k = 3;
int x = 3;
System.out.println(sol.findClosestElements(arr, k, x));
}
}