其他分享
首页 > 其他分享> > 【力扣 081】658. 找到 K 个最接近的元素

【力扣 081】658. 找到 K 个最接近的元素

作者:互联网

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

给定一个 排序好 的数组 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:使用 sort 排序

① 代码实现:

class Solution {
public:
  vector<int> findClosestElements(vector<int> &arr, int k, int x)
  {
    sort(arr.begin(), arr.end(), [=](int &a, int &b)
       { return abs(a - x) == abs(b - x) ? a < b : abs(a - x) < abs(b - x); });
    vector<int> res;
    for (int i = 0; i < k; i++)
    {
      res.push_back(arr[i]);
    }
    sort(res.begin(), res.end());
    return res;
  }
};

② 代码实现:

struct cmp
{
  cmp(int x) : x(x) {}
  bool operator()(int a, int b)
  {
    return (abs(a - x) == abs(b - x)) ? (a < b) : (abs(a - x) < abs(b - x)); //按照差的绝对值升序排序
  }
  int x;
};

class Solution
{
public:
  vector<int> findClosestElements(vector<int> &arr, int k, int x)
  {
    sort(arr.begin(), arr.end(), cmp(x));
    vector<int> result(k, 0);
    for (int i = 0; i < k; i++)
    { // 取最靠近的k个数
      result[i] = arr[i];
    }
    sort(result.begin(), result.end());
    return result;
  }
};

 

标签:arr,vector,int,res,081,力扣,abs,result,658
来源: https://www.cnblogs.com/sunbines/p/16323766.html