leetcode-658 找到K个最接近的元素

Posted yocichen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;

灵魂拷问:要是无序数组怎么办?

先排序,再如法炮制?

能优化吗?

技术图片

以上是关于leetcode-658 找到K个最接近的元素的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-658 找到K个最接近的元素

LeetCode 658 找到K个最接近的元素[二分法] HERODING的LeetCode之路

每日一题658. 找到 K 个最接近的元素

LeetCode658. 找到K个最近的元素

LeetCode658. 找到K个最近的元素

LeetCode658. 找到K个最近的元素