1. 问题背景与理解
最近在刷算法题时遇到一道很有意思的双指针题目——"找到 K 个最接近的元素"。这道题看似简单,但想要写出高效且优雅的解法并不容易。题目要求给定一个排序好的数组arr,两个整数k和x,找到数组中与x最接近的k个元素。返回的元素必须按升序排列。
这个问题在实际开发中有很多应用场景,比如:
- 推荐系统中找到与用户偏好最接近的若干商品
- 地理信息系统中查找距离某坐标最近的k个地点
- 时间序列分析中选取最接近某个时间点的若干数据
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力解法分析
最直观的解法可能是:
- 计算每个元素与x的差值绝对值
- 根据差值排序
- 取前k个最小的元素
- 最后再排序输出
这种方法的时间复杂度是O(nlogn),空间复杂度是O(n)。对于大数据量来说效率不高。
2.2 双指针解法优化
更优的解法是利用双指针。由于数组已经是有序的,我们可以利用这个特性来优化:
- 初始化两个指针left=0和right=len(arr)-1
- 比较arr[left]和arr[right]与x的距离
- 移动距离较远的一侧的指针
- 重复直到窗口大小等于k
这种方法的时间复杂度可以降到O(n),空间复杂度O(1)。
3. 详细实现步骤
3.1 双指针实现代码
python复制def findClosestElements(arr, k, x):
left, right = 0, len(arr) - 1
while right - left + 1 > k:
if abs(arr[left] - x) > abs(arr[right] - x):
left += 1
else:
right -= 1
return arr[left:right+1]
3.2 代码解析
- 初始化左右指针分别指向数组首尾
- 当窗口大小大于k时循环:
- 比较左右指针元素与x的距离
- 移动距离较远的一侧指针
- 最终返回窗口内的元素
3.3 边界情况处理
需要考虑的特殊情况包括:
- 当x小于数组最小值时
- 当
