思路:如果x小于等于首元素,返回前k个元素即可;如果x大于等于尾元素,返回最后k个元素即可;如果x值在数组首元素于为尾元素的值域中间,首先利用二分查找搜索到下的下标或比x大一点的元素下标index,让low= index左边第k-1个元素的下标,high = index右边第k-1个元素的下标,要查找的k个元素一定位于[low, high]。如果左边的元素更接近x,则high–,如果右边的元素更接近x,则low++。

代码:

class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {List<Integer> ret = Arrays.stream(arr).boxed().collect(Collectors.toList());int n = ret.size();//如果x <=首元素,则返回前k个元素if(x <= ret.get(0)){return ret.subList(0, k);// //如果x >= 尾元素,则返回后k个元素}else if(x >= ret.get(n-1)){return ret.subList(n - k, n);//x介于arr[0]和arr【n-】}else {//如果x在数组中,返回下标,否则返回-(插入键)-1,插入键为大于key的第一个元素int index = Collections.binarySearch(ret, x);//此时index= -(大于x的第一个数) - 1if(index < 0){//返回大于x的第一个数index = -index - 1;}//index - k - 1int low = Math.max(0, index - k );int high = Math.min(n - 1, index + k - 1);while (high - low > k - 1){if(ret.get(high) - x < x - ret.get(low)  ){low ++;}else {high--;}}return ret.subList(low, high + 1);}}
}

复杂度分析:时间0(log(n)+k),二分查找加缩减k个元素的时间。空间0(k)产生结果数组所需时间。

LeetCode658-找到k个最接近的元素相关推荐

  1. leetcode658. 找到 K 个最接近的元素(二分法)

    给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的那个数. 示例 1: ...

  2. C练题笔记之:Leetcode-658. 找到 K 个最接近的元素

    题目: 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a 比整数 b 更接近 x 需要满足: ...

  3. LeetCode题解:找到 K 个最接近的元素

    模版III - 找到 K 个最接近的元素(middle) 一.题目 LeetCode658.找到 K 个最接近的元素 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两 ...

  4. LeetCode 658、找到 K 个最接近的元素

    658.找到 K 个最接近的元素 1)题目描述 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 ...

  5. Java实现 LeetCode 658 找到 K 个最接近的元素(暴力)

    658. 找到 K 个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先 ...

  6. 【LeetCode通关全记录】658. 找到 K 个最接近的元素

    [LeetCode通关全记录]658. 找到 K 个最接近的元素 题目地址

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

    leetcode 658. 找到 K 个最接近的元素 题目描述: 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排 ...

  8. LeetCode——658. 找到 K 个最接近的元素(双指针)

    文章目录 658. 找到 K 个最接近的元素(双指针) 题目 1.双指针法 思想:** 代码 2.二分法 思想:** 代码 658. 找到 K 个最接近的元素(双指针) 来源:力扣(LeetCode) ...

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

    1.题目描述 658. 找到 K 个最接近的元素 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 ...

  10. 【658. 找到 K 个最接近的元素】

    来源:力扣(LeetCode) 描述:    给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a ...

最新文章

  1. 翻译下 golang package time
  2. 2018年第九届省赛C/C++A组第5题——打印图形
  3. English最俗语法大全
  4. My new iMac 27
  5. linux线程同步教程,多线程同步
  6. html5的狭义概念,“资源”这一概念,可以有狭义和广义两种理解。狭义的资源是指...
  7. 快速软件开发 学习笔记 之六
  8. 如何在跑cts的时候生成log_晚上跑高速如何超大货车,教你几条经验,关键时候能保命...
  9. 开源免费的录屏gif工具
  10. h5游戏引擎有哪些?h5制作模板游戏的教程和流程是什么?
  11. h5学习笔记 左右布局
  12. css3动画animation属性大全
  13. KUKA机器人视觉2
  14. IDEA 查看项目全部错误信息
  15. 微信小程序-H5-uniapp css制作上下跳动的柱状图——频谱
  16. 小米4 第三方re奇兔_小米Air 2 Pro -小米高端耳机的滑铁卢
  17. flutter 多渠道打包 不同环境不同包名 product flavors flavorDimensions
  18. c语言6行6列元素奇数的个数,C语言任意输入n个整数,分别统计奇数的和.奇数的个数.偶数的和.偶数的个数....
  19. linux下根据关键字批量杀掉进程
  20. /etc/shells 777权限,vsftp本地用户不能登陆

热门文章

  1. java基于微信小程序的家电维修预约系统 uniapp 小程序
  2. python xlrd_python-xlrd常用方法
  3. 证件照的背景色怎么更换?背景色更换方法教程来啦
  4. 透过非你莫属求职者--马玉双看SEO
  5. WPF ListView 排序
  6. 【性能优化】404- 从 12.67s到1.06s 性能优化实战
  7. hostapd android,使用hostapd和dnsmasq实现软AP
  8. Python常用模块2-Python的OS及errno模块
  9. 2023自助洗车店系统解决方案共享洗车无人洗车风口
  10. buuctf Misc 镜子里的世界