一維數組峯值

題目背景:一個數組N個數,裏面數滿足先增後減(請考慮單調遞增和遞減),請找出數組最大值。

要求:不適用額外空間,考慮時間時間複雜度log(N)

tips:一般情況,從任意一點劃分數據集,產生一個先增後減的區間和另一個單調遞減的區間。

def thepeak(arr):
    l = 0
    r = len(arr) - 1
    while l < r:
        #單調
        if arr[l] > arr[l+1] and arr[r-1] > arr[r]:
            return l
        elif arr[l] < arr[l+1] and arr[r-1] < arr[r]:
            return r
        #非單調
        mid = int((l+r)/2)
        if arr[l] < arr[l+1] and arr[mid-1] > arr[mid]:
            r = mid
        else:
            l = mid
        print l, r, mid
    return l

if __name__ == '__main__':
    arr = [1, 2, 3, 4, 5, 4, 3, 1]
    idx = thepeak(arr)
    print arr[idx]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章