658. 找到 K 个最接近的元素

658. 找到 K 个最接近的元素

给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。
658. 找到 K 个最接近的元素_第1张图片
解题思路: 此题我用二分查找没做出来,然后参考了Grandyang的博客,发现我们要保留k个数,然后摘除的数要距离x最远,由于原数组是有序的,那么距离最远的数一定位于数组的两端,只需要从两端每次摘除距离最大数即可。

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        int n = arr.size(), keep = arr.size() - k;
        while (keep != 0) {
            int a = abs(x - arr.front()), b = abs(x - arr.back());
            if (a > b) {
                arr.erase(arr.begin());
            } else {
                arr.pop_back();
            }
            --keep;
        }
        return arr;
    }
};

你可能感兴趣的:(leetcode)