LintCode 460 [ K Closest Numbers In Sorted Array]

原题

给一个目标数 target, 一个非负整数 k, 一个按照升序排列的数组 A。在A中找与target最接近的k个整数。返回这k个数并按照与target的接近程度从小到大排序,如果接近程度相当,那么小的数排在前面。

  • 如果 A = [1, 2, 3], target = 2 and k = 3, 那么返回 [2, 1, 3]
  • 如果 A = [1, 4, 6, 8], target = 3 and k = 3, 那么返回 [4, 1, 6]

解题思路

  • 使用Binary Search找到最接近的数字的位置
  • 双指针从该位置左右移动,每次比较找到最接近的数字,加入到答案中,相应的指针++
  • 中间while循环可以略作简化,通过优先处理特殊情况
while k > 0:
            if left < 0:
                res.append(A[right])
                right += 1
                k -= 1
            elif right > len(A) - 1:
                res.append(A[left])
                left -= 1
                k -= 1
            else:
                if abs(A[left] - target) <= abs(A[right] - target):
                    res.append(A[left])
                    left -= 1
                    k -= 1
                else:
                    res.append(A[right])
                    right += 1
                    k -= 1

完整代码

class Solution:
    # @param {int[]} A an integer array
    # @param {int} target an integer
    # @param {int} k a non-negative integer
    # @return {int[]} an integer array
    def kClosestNumbers(self, A, target, k):
        # Write your code here
        if not A or k == 0:
            return []
            
        res = []
        index = self.binarySearch(A, target)
        res.append(A[index])
        k -= 1
        left, right = index - 1, index + 1
        while k > 0:
            if left >= 0 and right <= len(A) - 1:
                if abs(A[left] - target) <= abs(A[right] - target):
                    res.append(A[left])
                    left -= 1
                    k -= 1
                else:
                    res.append(A[right])
                    right += 1
                    k -= 1
            if left < 0:
                while k > 0 and right <= len(A) - 1:
                    res.append(A[right])
                    right += 1
                    k -= 1
                break
            if right > len(A) - 1:
                while k > 0 and left >= 0:
                    res.append(A[left])
                    left -= 1
                    k -= 1
                break
        return res
        
        
    def binarySearch(self, L, target):
        start, end = 0, len(L) - 1
        while start + 1 < end:
            mid = start + (end - start) / 2
            if L[mid] == target:
                return mid
            elif L[mid] > target:
                end = mid
            else:
                start = mid
                
        return start if abs(L[start] - target) <= abs(L[end] - target) else end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 在夕阳的余晖下,所有的一切,包括绞刑架,都被怀旧的淡香所照亮。 ——米兰·昆德拉 01. 我不知道世界上有多少人和...
    青梅149阅读 3,064评论 0 10
  • 每日更换内衣物。 别人只看到外表,其实内衣物是贴身穿的,只有自己知道。但我们每天都会出汗,还有身上的分泌物,内衣物...
    逸凡小仙阅读 1,202评论 0 0
  • 【禅语】 污泥再不堪,莲也出之而不染。有人抱怨:“是社会毒害了我,我是被社会污染了。”我说,是被自己污染了。自己杂...
    武汉如心阅读 1,924评论 2 7
  • “罗杰号”需要在一周内到德雷克岛进行补给,进入奴马海域后,船员不再像之前的航程那么活跃了。随着补给即将用尽,更多的...
    租了五颗星阅读 4,668评论 6 4