自学内容网 自学内容网

算法随笔_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) 。


原文地址:https://blog.csdn.net/m0_70494097/article/details/145281551

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!