解法一:首先通过题意,可以得知,这是一个固定大小的数组,从而可以从滑动窗口这方面入手,固定K大小的窗口,然后通过窗口的左边界和右边界进行判断,从而可得到左边的下标值,通过这个值,构建数组返回。
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x)
{
int n=arr.size()-k;//固定滑动窗口位置
vector<int>v1;
//找到i的位置,
int i=0;
for(;i<n;i++)
{
//如果滑动数组所有值都大于x值,直接跳出,从当前位置就ok
if(arr[i]>=x)break;
//i比数组小,k比数组值小,需要向右移动
if(arr[i+k]<x)continue;
//在区间范围之内,需要比较i的值和i+k的差值大小,如果小于或者等于,不用移动,要不就继续向前移动
if(abs(arr[i]-x)<=abs(arr[i+k]-x))break;
}
for(int j=0;j<k;j++)
{
v1.push_back(arr[j+i]);
}
return v1;
}
};
解法二:重写快排的比较
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x)
{
//用lamlada 表达式重写比较函数或者仿函数
sort(arr.begin(),arr.end(),[&](int&a,int&b)->bool{return abs(a-x)<abs(b-x)||abs(a-x)==abs(b-x)&&a<b;});
sort(arr.begin(),arr.begin()+k);
return vector<int>(arr.begin(),arr.begin()+k);
}
};