题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
代码(一):
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
return min(rotateArray)
代码思路:遍历。把所有数都过一遍找出最小的。但是 问题是:时间复杂度为O(n)
代码(二):
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return None
if rotateArray[0]<rotateArray[-1]:
return rotateArray[0]
else:
ind_1 = 0
ind_2 = len(rotateArray)-1
while ind_1<ind_2:
mid =ind_1 + (ind_2 - ind_1)//2
if rotateArray[ind_1]<=rotateArray[mid]:
ind_1 = mid
else:
ind_2 = mid
if (ind_1 + 1) == ind_2:
return min(rotateArray[ind_1],rotateArray[ind_2])
代码思路:除了在原状态就是没有旋转或者旋转回原本的顺序的时候,这时候 直接提取第一个元素就可以了。
其余情况,我们可以把数列看成两部分。{3,4,5,1,2}两个递增序列:{3,4,5}{1,2}。我们可以看到有旋转以后的序列第一个元素一定会比最后一个大。
因此,我们设立两个指针,第一个指针指向begin=0下标,第二个指针指向最后一个end=4下标。然后新指针为mid=(4-0)//2 取半,比较 begin mid ,如果mid更大,begin=mid;如果mid小于end,end=mid。因此栗子从{3,4,5,1,2}变为{5,1,2} 指针范围内的值。重复直到end和begin差一,两者中最小的就是我们要找的值了。