LintCode 447 [Search in a Big Sorted Array]

原题

Given a big sorted array, find the first index of a target number. Your algorithm should be in O(log k), where k is the first index of the target number.
Return -1, if the number doesn't exist in the array.

解题思路

  • 二分查找
  • 由于有重复数字时,返回第一个出现的index,所以A[mid] == target时,end = mid
  • 由于数组非常大,所以我们希望用一种方式找到刚刚好比target大一些的数作为end,代码如下:
end = 0
while end < len(A) and A[end] < target:
    end = end * 2 + 1
if end >= len(A):
    end = len(A) - 1

完整代码

class Solution:
    # @param {int[]} A an integer array
    # @param {int} target an integer
    # @return {int} an integer
    def searchBigSortedArray(self, A, target):
        if not A:
            return -1
            
        end = 0
        while end < len(A) and A[end] < target:
            end = end * 2 + 1
        if end >= len(A):
            end = len(A) - 1
        
        start = 0
        while start + 1 < end:
            mid = start + (end - start) / 2
            if A[mid] >= target:
                end = mid
            else:
                start = mid
                
        if A[start] == target:
            return start
        elif A[end] == target:
            return end
                
        return -1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • 有时候,我们明明觉得自己做的很对,却依然得不到我们所想要的。我们听过很多道理,却依然过不好这一生。 1. 2014...
    霍小末阅读 783评论 9 14
  • 既然已经倒霉到家,剩下的就只有触底反弹了。 没有再比现在更想看书、搜索网络的了,可是这小小的想法也实现不了。眼泪是...
    君子包阅读 291评论 3 7
  • 斜杠青年是现在流行的自媒体术语,知识变现也大行其道,月入十万也几乎成了标题党里关键词。然而,对于绝大多数人而言,个...
    Jun哥笔记阅读 923评论 0 2
  • 老郭瞅了眼老伴挂瓶里的水,呦,就迷瞪了一会,水都快挂完了!老郭站起了身子来,赶忙跑去护士站叫小钟来给老伴换药,小...
    曾居然阅读 265评论 0 3