码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-04 21:47:22      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:inf   --   ase   com   ems   src   public   font   lock   

“学而不思则惘” 


 

题面:给定一个排序好的数组,两个整数 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个最接近的元素

标签:inf   --   ase   com   ems   src   public   font   lock   

原文地址:https://www.cnblogs.com/yocichen/p/11461215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!