LeetCode658-找到k个最接近的元素
思路:如果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个最接近的元素相关推荐
- leetcode658. 找到 K 个最接近的元素(二分法)
给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的那个数. 示例 1: ...
- C练题笔记之:Leetcode-658. 找到 K 个最接近的元素
题目: 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a 比整数 b 更接近 x 需要满足: ...
- LeetCode题解:找到 K 个最接近的元素
模版III - 找到 K 个最接近的元素(middle) 一.题目 LeetCode658.找到 K 个最接近的元素 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两 ...
- LeetCode 658、找到 K 个最接近的元素
658.找到 K 个最接近的元素 1)题目描述 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 ...
- Java实现 LeetCode 658 找到 K 个最接近的元素(暴力)
658. 找到 K 个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先 ...
- 【LeetCode通关全记录】658. 找到 K 个最接近的元素
[LeetCode通关全记录]658. 找到 K 个最接近的元素 题目地址
- leetcode 658. 找到 K 个最接近的元素
leetcode 658. 找到 K 个最接近的元素 题目描述: 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排 ...
- LeetCode——658. 找到 K 个最接近的元素(双指针)
文章目录 658. 找到 K 个最接近的元素(双指针) 题目 1.双指针法 思想:** 代码 2.二分法 思想:** 代码 658. 找到 K 个最接近的元素(双指针) 来源:力扣(LeetCode) ...
- LeetCode 每日一题——658. 找到 K 个最接近的元素
1.题目描述 658. 找到 K 个最接近的元素 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 ...
- 【658. 找到 K 个最接近的元素】
来源:力扣(LeetCode) 描述: 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a ...
最新文章
- 翻译下 golang package time
- 2018年第九届省赛C/C++A组第5题——打印图形
- English最俗语法大全
- My new iMac 27
- linux线程同步教程,多线程同步
- html5的狭义概念,“资源”这一概念,可以有狭义和广义两种理解。狭义的资源是指...
- 快速软件开发 学习笔记 之六
- 如何在跑cts的时候生成log_晚上跑高速如何超大货车,教你几条经验,关键时候能保命...
- 开源免费的录屏gif工具
- h5游戏引擎有哪些?h5制作模板游戏的教程和流程是什么?
- h5学习笔记 左右布局
- css3动画animation属性大全
- KUKA机器人视觉2
- IDEA 查看项目全部错误信息
- 微信小程序-H5-uniapp css制作上下跳动的柱状图——频谱
- 小米4 第三方re奇兔_小米Air 2 Pro -小米高端耳机的滑铁卢
- flutter 多渠道打包 不同环境不同包名 product flavors flavorDimensions
- c语言6行6列元素奇数的个数,C语言任意输入n个整数,分别统计奇数的和.奇数的个数.偶数的和.偶数的个数....
- linux下根据关键字批量杀掉进程
- /etc/shells 777权限,vsftp本地用户不能登陆