二分查找总结及部分Lintcode题目分析 2

Search in a big sorted array,这个比以前的二分法模板多了一个很不一样的特性,就是没法知道一个重要的条件end值,也是题目中强调的重点 The array is so big so that you can not get the length of the whole array directly~因此这里单独分析这个问题~python

 

通常涉及到sorted array,确定能够的解决方法是for loop,然而for loop的复杂度是O(n),并且对于这个长度没法衡量的big sorted array也并不适用。并且,看到sorted array能够联想到的就是binary search啦~因此第一步就是怎么肯定这个end值~less

index = 1
        while reader.get(index) < target:
            index = index * 2
        start = 0
        end = index

 (这个reader是题目给定的python get element的方法)因为是sorted array,若是这个 target 存在,那么必然从某个节点开始,以后全部的元素都大于这个 target,咱们保留有解的一半的思想,这里至关于就给这个big sorted array分为了两个部分,咱们取有解的前一部分,放弃必然大于target的后一部分。这时候也就找到了end的值~就把他转化成了一个长度可计的sorted array,再套用二分法的解题模板就能够解决这个问题。po个解法~oop

 

"""
Definition of ArrayReader:
class ArrayReader:
    def get(self, index):
        # this would return the number on the given index
        # return -1 if index is less than zero.
"""
class Solution:
    # @param {ArrayReader} reader: An instance of ArrayReader 
    # @param {int} target an integer
    # @return {int} an integer
    def searchBigSortedArray(self, reader, target):
        index = 1
        while reader.get(index) < target:
            index = index * 2
        start = 0
        end = index
        while start + 1 < end:
            mid = start + (end - start) / 2
            if reader.get(mid) == target:
                end =  mid
            elif reader.get(mid) < target:
                start = mid
            else:
                end = mid
        if reader.get(start) == target:
            return start
        if  reader.get(end) == target:
            return end
        return -1
相关文章
相关标签/搜索