【力扣 081】658. 找到 K 個最接近的元素
阿新 • • 發佈:2022-05-29
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; } };