二分
一、在数组中查找局部最小的数
思路:二分查找
代码:
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))