leetcode-658 找到K个最接近的元素
“学而不思则惘”
题面:给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。
示例 1:
输入: [1,2,3,4,5], k=4, x=3
输出: [1,2,3,4]
示例 2:
输入: [1,2,3,4,5], k=4, x=-1
输出: [1,2,3,4]
说明:
k 的值为正数,且总是小于给定排序数组的长度。
数组不为空,且长度不超过 104
数组里的每个元素与 x 的绝对值不超过 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-k-closest-elements
思路:数组本来是有序的,所以可以使用双下标逼近法去逼近,如果左边靠X近(差值绝对值小),那么右边左移;否则,左边右移。
时间:O(n)
空间:O(1)
1 class Solution { 2 public: 3 //时间O(n),空间O(n) 4 vector<int> findClosestElements1(vector<int>& arr, int k, int x) { 5 int len = arr.size(); 6 if(len <= 0 || k > len) 7 return {}; 8 vector<int> res = arr; 9 while(res.size() > k) 10 { 11 if(abs(x-res[0]) > abs(x-res[res.size()-1])) 12 res.erase(res.begin()); 13 else 14 res.erase(res.end()-1); 15 } 16 return res; 17 } 18 //时间O(n),空间O(1) 19 vector<int> findClosestElements(vector<int>& arr, int k, int x) { 20 int len = arr.size(); 21 if(len <= 0 || k > len) 22 return {}; 23 24 int l = 0, r = len-1; 25 while((r - l + 1) > k) 26 { 27 if(abs(x-arr[l]) > abs(x-arr[r])) 28 l++; 29 else 30 r--; 31 } 32 return vector<int>(arr.begin()+l, arr.begin()+l+k); 33 } 34 };
灵魂拷问:要是无序数组怎么办?
先排序,再如法炮制?
能优化吗?