自学内容网 自学内容网

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

题目

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

我的解法

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        int right = lower_bound(arr.begin(), arr.end(), x) - arr.begin();//二分查找获取元素下标
        int left = right - 1;
        right++;
        while(k>0){
            if(arr[left]-x<arr[right]-x){
                left--;
                k--;
            }else if(arr[left]-x>arr[right]-x){
                right++;
                k--;
            }else if(arr[left]-x=arr[right]-x){
                if(k>1){
                    left--;
                    right++;
                    k=k-2;
                }else{
                    left--;//会有问题,如果两个边界都到头了怎么办
                }
            }
        }
        }
        return vector<int>(arr.begin() + left + 1, arr.begin() + right);
    }
};

针对这个问题,需要在每一次循环前加一个判断边界

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        int right = lower_bound(arr.begin(), arr.end(), x) - arr.begin();//二分查找获取元素下标
        int left = right - 1;
        while(k--){
            if(left<0){
                right++;
            }else if(right>=arr.size()){
                left--;
            }else if(x-arr[left]>arr[right]-x){
                right++;
            }else{
                left--;
            }
        }
        return vector<int>(arr.begin() + left + 1, arr.begin() + right);
    }
};


原文地址:https://blog.csdn.net/qq_43920838/article/details/143749681

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!