【题目描述】
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
【解题思路】
- 直接法:最直接的思路是调用Python的min()函数,时间复杂度为O(n),空间复杂度为O(1)。
2.二分查找法:由于数组在某种程度上来说是有序的,所以可以用二分法将时间复杂度控制在O(logn),空间复杂度仍然为O(1)。由于旋转数组是由非递减的数组的最开始的若干个元素搬到末尾得到的,则如果数组的首元素小于数组的末尾元素,那么数组一定是有序的。如果数组的首元素等于数组的末尾元素,则数组不一定有序,比如{2,2,2,2,2}和{1,0,1,1,1}的例子。Python实现的代码为:
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
end = len(rotateArray) - 1
start = 0
while start <= end:
# 如果数组的首元素小于数组的末尾元素,那么数组一定是有序的。
if rotateArray[start] < rotateArray[end]:
return rotateArray[start]
else:
mid = int((start + end)/2)
# 如果中间元素小于末尾元素,则后半段一定有序
if rotateArray[mid] < rotateArray[end]:
end = mid
# 如果中间元素大于等于末尾元素,则证明最小元素一定在后半段
else:
start = mid + 1
# start此时已大于end, 如果之前还没有返回任何值,则证明rotateArray[end]为最小值
return rotateArray[end]