描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
-
遍历数组
-
二分查找的变形,旋转数组的首元素肯定不小于旋转数组的尾元素,找一个中间点,如果中间点比首元素大,说明最小数字在中间点后面,如果中间点比尾元素小,说明最小数字在中间点前面。然后循环。但是在一次循环中,首元素小于尾元素,说明该数组是排序的,首元素就是最小数字. 如果出现首元素、尾元素、中间值三者相等,则只能在此区域中顺序查找。(注意如果一开始就出现首尾中相等情况时可能会出现漏掉最小值的情况,所以把这个判断放在其余判断最前面)
def minNumberInRotateArray(rotateArray):
left = 0
right = len(rotateArray) - 1
while left < right:
mid = int((left + right) / 2)
if rotateArray[mid] > rotateArray[right]:
left = mid + 1
elif rotateArray[mid] == rotateArray[right]:
right -= 1
else:
right = mid
return rotateArray[left]