一、题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
请实现一个函数,输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如,数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。
注:给出的所有元素都大于0,若数组大小为0,请返回0。
二、解题
(一)解题思路
采用二分查找解决该问题。假设数组为[A, …, B, C, …, D]为非递增数组[C, …, D, A, …, B]的一个旋转,mid = low + (high - low) / 2。
由题目可知,C≤D≤A≤B。
考虑以下三种情况:
- array[mid] > array[high]:
出现这种情况,说明mid在C~D之间,此时最小元素一定在mid的右边。
low = mid + 1 - array[mid] == array[high]:
出现这种情况不能判断最小元素在mid的哪一边,因此只能一个一个试。
high -= 1 - array[mid] < array[high]:
出现这种情况,说明mid在A~B之间,此时最小元素一定是array[mid]或者在mid的左边。
high = mid
(二) 代码实现
代码实现使用python 2.7.3。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
length = len(rotateArray)
if length == 0:
return 0
else:
start = 0
end = length - 1
while start < end:
mid = start + ((end - start) >> 1)
if rotateArray[mid] > rotateArray[end]:
start = mid + 1
elif rotateArray[mid] == rotateArray[end]:
end -= 1
elif rotateArray[mid] < rotateArray[end]:
end = mid
return rotateArray[start]