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

题目链接
难度:中等       类型: 数组、二分查找


给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

说明:
k 的值为正数,且总是小于给定排序数组的长度。
数组不为空,且长度不超过 104
数组里的每个元素与 x 的绝对值不超过 104

示例1

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

示例2

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

解题思路


二分查找找到离x最近的数,然后在附近搜索差最小的数

代码实现

class Solution(object):
    def findClosestElements(self, arr, k, x):
        """
        :type arr: List[int]
        :type k: int
        :type x: int
        :rtype: List[int]
        """
        self.res = []
        def find(arr, left, right, k, x):
            while k>0:
                k-=1
                if left<0:
                    self.res += arr[right:right+k+1]
                    break
                elif right>=len(arr):
                    self.res = arr[left-k:left+1] + self.res 
                    break
                elif abs(arr[left]-x) <= abs(arr[right]-x):
                    self.res = [arr[left]] + self.res
                    left -= 1
                else:
                    self.res += [arr[right]]
                    right += 1
           
        
        left, right = 0, len(arr)
        while left<right:
            mid = (left+right)//2
            if arr[mid] == x:
                self.res.append(x)
                find(arr, mid-1, mid+1, k-1, x)
                return self.res
            
            elif arr[mid]>x:
                right = mid
            else:
                left = mid+1
        find(arr, left-1, right, k, x)
        return self.res

本文链接:https://www.jianshu.com/p/3ed7e3cf5d38

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容