目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给定一个 排序好 的数组 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-k-closest-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
* 解题思路: * 先找到最贴近x的位置,然后从这个位置开始向两侧开始寻找
代码:
public class Solution658 {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int index = arr.length;
for (int i = 0; i < arr.length; i++) {
int value = arr[i];
if (x - value < 0) {
index = i;
break;
}
}
index--;
int left = index;
int right = index + 1;
List<Integer> result = new ArrayList<>();
while (result.size() < k) {
if (left < 0) {
result.add(arr[right]);
right++;
continue;
}
if (right >= arr.length) {
result.add(arr[left]);
left--;
continue;
}
int leftValue = arr[left];
int rightValue = arr[right];
if (Math.abs(leftValue - x) > Math.abs(rightValue - x)) {
result.add(rightValue);
right++;
continue;
}
result.add(leftValue);
left--;
}
Collections.sort(result);
return result;
}
}