返回
发现离目标最近的k个元素,轻松掌握658题解题技巧
见解分享
2023-10-06 10:00:55
哈喽,大家好,我是技术博客创作专家,今天我们来一起看看LeetCode中的第658题:找到K个最接近的元素。
题目
给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最接近 x 的 k 个元素。
您需要以 升序 返回结果。
示例 1:
输入:arr = [1,2,3,4,5], k = 4, x = 3
输出:[1,2,3,4]
示例 2:
输入:arr = [1,2,3,4,5], k = 2, x = -1
输出:[1,2]
示例 3:
输入:arr = [1,1,1,10,10,10], k = 1, x = 9
输出:[10]
提示:
- 1 <= k <= arr.length
- 1 <= arr.length <= 10^4
- arr 是 [-10^4, 10^4] 中的整数
- arr 按 升序 排序
- -10^4 <= x <= 10^4
解题思路
这道题的思路相对简单,我们可以利用二分查找算法来解决。
- 首先,我们先用二分查找算法找到一个元素,这个元素的值最接近x。
- 然后,我们以这个元素为中心,向两边扩展,找到最接近x的k个元素。
- 最后,我们将找到的这k个元素按照升序排列,并返回。
代码示例
def findClosestElements(arr, k, x):
"""
:type arr: List[int]
:type k: int
:type x: int
:rtype: List[int]
"""
# 使用二分查找找到一个元素,这个元素的值最接近x
left, right = 0, len(arr) - 1
while left < right:
mid = (left + right) // 2
if arr[mid] == x:
return arr[mid-k+1:mid+k]
elif arr[mid] < x:
left = mid + 1
else:
right = mid - 1
# 以这个元素为中心,向两边扩展,找到最接近x的k个元素
left, right = max(0, left - k), min(len(arr) - 1, right + k)
while right - left + 1 > k:
if x - arr[left] < arr[right] - x:
right -= 1
else:
left += 1
# 将找到的这k个元素按照升序排列,并返回
return arr[left:right+1]
结语
以上就是658题的解题思路和代码示例。希望大家能够通过这篇文章学到一些新的知识。如果您有任何问题,欢迎在评论区留言。