二分

一、在数组中查找局部最小的数

 

思路:二分查找

代码:

 

def getLessIndex(arr):
    if not arr:
        return -1
    n = len(arr)
    if n == 1 or arr[0] < arr[1] :
        return 0
    if arr[n-1] < arr[n-2]:
        return n - 1
    left = 1
    right = n - 2
    while left < right:
        mid = (left + right) // 2
        if arr[mid] > arr[mid - 1]:
            right = mid - 1
        elif arr[mid] > arr[mid + 1]:
            left = mid + 1
        else:
            return mid
    return left #当left = right结束时,返回当前值,即局部最小值
arr = [3,1,5,4,7,8]
getLessIndex(arr)

 二、题目:在循环有序数组中查找某个数

循环有序数组:

指的是,将一个有序数组循环左/右移动若干距离之后变成的数组。如,[1,2,3,4,5]循环右移3位,就成为[4,5,1,2,3]。该数组的特点是,其中包含着一个转折点。转折点左右两侧的子数组都是有序的,并且左侧的子数组整体都比右侧的子数组大。

在一个循环有序数组中查找某个数

思路:

  

代码:

#coding=utf-8
def findNum(arr,N):
    if len(arr)< 1:
           return -1
    left , right = 0 , len(arr) - 1
    while left < right:
        mid = (left+right) // 2
        if arr[mid] == N:
            return mid
        if arr[left] < arr[mid]:
            if arr[left] <= N and arr[mid] > N:
                right = mid
            else:
                left = mid
        else:
            if arr[mid] < N and arr[right] >= N:
                left = mid
            else:
                right = mid
    return -1
if __name__ == '__main__':
    arr = [4,5,6,7,0,1,2]
    N = 5
    print(findNum(arr,N))
           
           

 

 

 

posted on 2019-03-13 18:44  吱吱了了  阅读(197)  评论(0编辑  收藏  举报

导航