思路:

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;
    }
}