题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
暴力:
数列是两个递增的子序列组成的,所以找到他们组合的那个点就好了。
从头开始找,找到第一个比mini小的值
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
mini = rotateArray[0]
i = 1
while i <len(rotateArray):
if rotateArray[i]<mini:
return rotateArray[i]
else:
i += 1
return mini
优化-二分法:
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
l = 0
r = len(rotateArray)-1
while l < r :
# 这里注意一下,可能从第0号元素开始旋转,所以可能整个数组递增。
if rotateArray[l]<rotateArray[r]:
return rotateArray[l]
# 为了避免死循环 mid = (l+r)//2 和 l = mid+1 搭配
# mid = (l+r+1)//2 和 r = mid -1搭配使用
mid = l + (r-l)//2
if rotateArray[l]<rotateArray[mid] or rotateArray[r]<rotateArray[mid]:
l = mid + 1
elif rotateArray[l]>rotateArray[mid] or rotateArray[r]>rotateArray[mid]:
r = mid
else:
while l<r and rotateArray[l]==rotateArray[mid]:
l += 1
return rotateArray[l]