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

算法随笔_15: 找到K个最接近的元素

上一篇:算法随笔_14: 平方数之和-CSDN博客

题目描述如下:

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

  • |a - x| < |b - x| 或者
  • |a - x| == |b - x| 且 a < b

示例 1:

输入:arr = [1,2,3,4,5], k = 4, x = 3
输出:[1,2,3,4]

算法思路:

由于给定的数组已经是排好序的。我们可以用二分查找法,先找到最靠近x的两个元素:

1. 小于或等于x的所有数中的最大值,即,x左侧的最大值。我们设它的下标为left_ind。

2.  大于x的所有数中的最小值,即,x右侧的最小值,我们设它的下标为right_ind。

找到这两个下标后,我们循环执行下面的步骤k次,来找到k个最接近的元素:

==================

我们判断x与arr[left_ind]的距离是否小于x与arr[right_ind]的距离。有两种情况:

a. 如果小于,说明arr[left_ind]是第一接近x的元素。为了找到第二接近x的元素,我们需要向左移动left_ind下标,即,left_ind=left_ind-1。

b. 如果大于,说明arr[right_ind]是第一接近x的元素。我们需要向右移动right_ind下标,即,right_ind=right_ind+1。

重复此步骤。

===================

此算法的时间复杂度为O(logn+k) 。


http://www.kler.cn/a/514183.html

相关文章:

  • 【Vim Masterclass 笔记22】S09L40 + L41:同步练习11:Vim 的配置与 vimrc 文件的相关操作(含点评课内容)
  • 机器学习(5):支持向量机
  • Linux系统的第一个进程是什么?
  • vue3 通过ref 进行数据响应
  • 可视化-numpy实现线性回归和梯度下降法
  • StackOrQueueOJ3:用栈实现队列
  • Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
  • 62,【2】 BUUCTF WEB [强网杯 2019]Upload1
  • 422. 有效的单词方块
  • 在stm32中C语言编写的程序中,一个整形数据是怎么存储的,高位在前还是低位在前
  • Qt按钮美化教程
  • 高频交易中 FPGA 的作用及面试指南
  • 小红书用户作品列表 API 系列,返回值说明
  • Go CSP并发模型
  • python md5加密
  • 《AI赋能光追:开启图形渲染新时代》
  • 3.1 Go函数调用过程
  • 论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。
  • 校园二手交易平台小程序设计与实现(LW+源码+讲解)
  • Vue.js 组件开发:打造高效、可维护的前端架构
  • web前端3--css
  • Java设计模式 五 建造者模式 (Builder Pattern)
  • Redis实训:社交关注关系存储任务
  • OneData体系架构详解
  • react中hooks之 React 19 新 Hooks useActionState useFormStatus用法总结
  • js重要知识点