力扣解法汇总658-找到 K 个最接近的元素

 目录链接:

力扣编程题-解法汇总_分享+记录-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 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 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;
    }
}

你可能感兴趣的:(编程题,leetcode,算法,职场和发展)