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个最接近的元素的主要内容,如果未能解决你的问题,请参考以下文章