题目
把一个非递减排序数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
利用二分查找算法,每次的mid与右端点进行比较把数组分为空、长度为1、长度大于等于2的三种情况.先将长度大于2的进行循环查找使得最终的正确答案在较短的数组中,然后数组为空是一种,长度为1是一种,长度为2是一种。
代码
#考虑非递减class Solution: def __init__(self): self.ro=[] def minNumberInRotateArray(self,rotatearray): self.ro=rotatearray while len(self.ro)>2: mid=len(self.ro)//2 if self.ro[mid]>self.ro[-1]: self.ro=self.ro[mid+1:] else: self.ro=self.ro[:mid+1] if len(self.ro)==0: return 0 elif len(self.ro)==1: return self.ro[0] else: if self.ro[0]>self.ro[1]: return self.ro[1] else: return self.ro[0]
非常注意的点
- 注意题中给出的提示,如果数组长度为0,或长度为1要单独考虑
- 循环过程中,最后正确答案落在数组中,数组长度可能为1,也可能为2
- mid=len(self.ro)/2 向下取整正好可以当作索引
- 循环过程中,如果mid大于右端点,则取右侧;如果mid小于右端点,则取左侧包含临界点;如果mid等于右端点那么右侧值全部相等,这时取左侧包含临界点。