题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:二分查找
(1)若只有小半的数字被旋转过去,则中间数位于前半部的非递减数组内,此时中间数>=左边>=右边,最小数位于右边
(2)若有大半部的数字被旋转过去,则中间数位于后半部分的非递减数组内,此时中间数<=右边<=左边,最小数位于左边
(3)若中间数等于左边和右边的值,则需要在数组内暴力查找,例如重复数组
python代码实现:
class Solution:
def find(rotateArray,left,right):
minValue = rotateArray[left]
for i in range((left+1),(right+1)):
if rotateArray[i]<minValue:
minValue = rotateArray[i]
return minValue
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
left = 0
right = len(rotateArray)-1
mid = left
while rotateArray[left]>=rotateArray[right]:
if right-left==1:
mid = right
break
mid = (left+right)/2
if rotateArray[left]==rotateArray[mid] and rotateArray[left]==rotateArray[right]:
return find(rotateArray,left,right)
if rotateArray[mid]>=rotateArray[left]:
left = mid
elif rotateArray[mid]<=rotateArray[right]:
right = mid
return rotateArray[mid]
参考文章:https://blog.csdn.net/htt789/article/details/80970533