思路:
1-所有数据先减x;再取绝对值;得到与x之差的数组,且均为正整数
2-在x之差的数组中,找到数值最小的数;记录下标
3-最小值下标为中心,双指针法移动,获取k个数;保存这k个数的下标
4-对下标进行排序,然后按照下标到 nums 取出数据
import java.util.*;
public class Solution {
// 所有数据先减x;再取绝对值;得到与x之差的数组,且均为正整数
// 在x之差的数组中,找到数值最小的数;记录下标
// 最小值下标为中心,双指针法移动,获取k个数;保存这k个数的下标
// 对下标进行排序,然后按照下标到 nums 取出数据
public ArrayList<Integer> closestElement(ArrayList<Integer> nums, int k, int x) {
// 所有数据先减x;再取绝对值;得到与x之差的数组,且均为正整数
ArrayList<Integer> absList = new ArrayList<>();
for (int val : nums) {
absList.add(Math.abs(val - x));
}
// 在x之差的数组中,找到数值最小的数;记录下标
int minNum = Integer.MAX_VALUE;
int minIndex = -1;
int absSize = absList.size();
for (int i = 0; i < absSize; i++) {
int val = absList.get(i);
if (val < minNum) {
minNum = val;
minIndex = i;
}
}
// 最小值下标为中心,双指针法移动,获取k个数;保存这k个数的下标
ArrayList<Integer> idxList = new ArrayList<>();
// 题目 k>=1;至少要保存一个最小值
idxList.add(minIndex);
int times = 0;
int left = minIndex - 1;
int right = minIndex + 1;
// 已经保存过了 minIndex,保存的下标需要减1
while (times < k - 1) {
if (left < 0) {
// left 下标小于0时,移动 right 下标
idxList.add(right);
right++;
} else if (right >= absSize) {
// right 下标小于列表长度,移动 left 下标
idxList.add(left);
left--;
} else {
// left/right 在列表长度之内,计算与X之差的大小;那个小就保存下标
if (absList.get(left) <= absList.get(right)) {
idxList.add(left);
left--;
} else {
idxList.add(right);
right++;
}
}
times++;
}
// 对下标列表排序,获取升序后的下标
Collections.sort(idxList);
// 依据下标获取 nums 源数据
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < idxList.size(); i++) {
int index = idxList.get(i);
int val = nums.get(index);
result.add(val);
}
return result;
}
}



京公网安备 11010502036488号