当前位置: 首页 > news >正文

【LeetCode刷题-二分查找】--658.找到K个最接近的元素

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

image-20231112125748719

方法一:二分查找+双指针

  • 假设数组长度为n,数组arr已经按照升序排序,可以将数组arr分为两部分,前一部分所有元素[0,left]都小于x,后一部分[right,n-1]都大于等于x,left与right都可以通过二分查找获得
  • left和right指向的元素都是各自部分最接近x的元素,因此我们可以通过比较left和right指向的元素获取整体最接近x的元素,如果x-arr[left]≤arr[right]-x,则将left-1,否则将right+1,相应地,如果left或right已经越界,那么不考虑对应部分的元素
  • 最后,区间[left+1,right-1]的元素就是需要获得的结果
class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {int right = binarrySearch(arr,x);int left = right - 1;while(k-->0){if(left < 0){right++;}else if(right >= arr.length){left--;}else if(x - arr[left] <= arr[right] -x){left--;}else{right++;}}List<Integer> ans = new ArrayList<>();for(int i = left+1;i<right;i++){ans.add(arr[i]);}return ans;}public int binarrySearch(int[] arr,int x){int low = 0,high = arr.length - 1;while(low < high){int mid = low + (high - low) / 2;if(arr[mid] >= x){high = mid;}else{low = mid + 1;}}return low;}
}

方法二:二分查找

class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {int left = 0,right = arr.length -1;while(right - left + 1>k){if(Math.abs(arr[left] - x) > Math.abs(arr[right] - x)){left++;}else{right--;}}List<Integer> result = new ArrayList<>();for (int i = left; i <= right; i++) {result.add(arr[i]);  // 将选定范围内的元素添加到结果列表}return result;}
}
http://www.lryc.cn/news/226940.html

相关文章:

  • 新方向!文心一言X具身智能,用LLM大模型驱动智能小车
  • mysql.sock找不到怎么解决?
  • 微信小程序刷新当前页面(亲测有效)
  • 通过拉普拉斯特征映射降维
  • 【信息安全原理】——传输层安全(学习笔记)
  • GBDT减少模型偏差、随机森林减小模型方差
  • 使用IDEA工具处理git合并后的冲突的细节
  • 快速下载ChatGLM系列模型
  • 【数据结构】顺序表 | 详细讲解
  • 100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?
  • HTML转义字符
  • 【STM32】
  • U盘不可以访问的维护
  • SpringCloud 微服务全栈体系(十三)
  • ROC 曲线详解
  • 113.路径总和II
  • 【Linux】WSL安装Kali及基本操作
  • Linux基础开发工具之调试器gdb
  • Apache APISIX 的 Admin API 默认访问令牌漏洞(CVE-2020-13945)漏洞复现
  • Clickhouse学习笔记(3)—— Clickhouse表引擎
  • WebSocket是什么以及其与HTTP的区别
  • Flutter 实战:构建跨平台应用
  • Python中68个内置函数的使用与归类
  • AGV無人搬送車控制系统Pytorn
  • 使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计
  • Android13分享热点设置安全性为wpa3
  • 2023-11-12 LeetCode每日一题(Range 模块)
  • 【六袆 - Framework】Angular-framework;前端框架Angular发展的由来0001;
  • JAVA集合学习
  • 【Linux】语言层面缓冲区的刷新问题以及简易模拟实现