把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:从中可看出,旋转数组由两部分递增序列组成,而其最小值就是此两部分的边缘处,即比前面递增序列小的数。
1.顺序查找的一个稍微改进
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
left = 0
right = len(rotateArray)-1
if not len(rotateArray):
return 0
minn = rotateArray[0]
for i in range(1,len(rotateArray)):
if minn > rotateArray[i]: #碰到了后面递增序列的第一个数
minn = rotateArray[i]
break
return minn
2,二分查找的应用
class Solution: def minNumberInRotateArray(self, rotateArray): #此题主要考的是二分查找的应用 left = 0 right = len(rotateArray) - 1 if not len(rotateArray): return 0 #保证是旋转的数组 while (rotateArray[left] >= rotateArray[right]): # 如果左指针和右指针相邻,则最小数就是右指针所指的数 if ((right - left) == 1): mid = right break mid = (right + left) / 2 #如果数组中间数和左指针、右指针都相同,如:【1,0,1,1,1】 #则顺序查找 if (rotateArray[mid] == rotateArray[left] and rotateArray[right]): return min(rotateArray) #如果左指针数小于数组的中间元素数,则证明数组的中间元素数处于前面的递增数组中,此时,左指针指向中间元素 #反之,中间元素数处于后面递增数组中,用右指针指向中间元素数 #此时可看到,左边元素始终指向前面的递增数组,右边元素始终指向后面的递增数组,则当左右指针相邻时,右指针的数即为最小的数 if (rotateArray[left] < rotateArray[mid]): left = mid else: right = mid return rotateArray[mid]