二分查找(Binary Search):每次查找都把旋转数组平均分成两部分,通过比较当前旋转数组两端点和中间点的值,判断最小值在数组的哪一部分,从而达到缩小搜索范围的目的。其中,两端点为当前的旋转数组索引最小和索引最大的元素,中间点为这两部分子数组的连结元素,也可以看做为轴枢点(pivot point),这里取旋转数组的最小索引和最大索引的算术平均值(向下取整)作为索引,其对应的元素作为中间点。
按照上述的思路,第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最终第一个指针将指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素。也就是它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素。这就是循环结束的条件。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
if not rotateArray:return 0
low, high = 0, len(rotateArray)-1
while low < high - 1:
mid = (low+high)//2
if rotateArray[mid-1] > rotateArray[mid]:
return rotateArray[mid]
elif rotateArray[low] > rotateArray[mid-1]:
high = mid
else:
low = mid
return rotateArray[0]
emmm有点上述太复杂了
利用二分的性质很好做
class Solution:
def findMin(self, nums: List[int]) -> int:
if not nums:return 0
l=0
r=len(nums)-1
while l<r:
mid = l+r>>1
if nums[mid]<=nums[-1]:r=mid
else:l=mid+1
return nums[r]