《剑指offer》面试题7:旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
1.如果使用暴力查找法,则可以迅速求解,但是使用这种方法绝对不可能通过面试,达不到面试官考察的要求,求解的方法如下:
class Solution: def minNumberInRotateArray(self, rotateArray): # write code here #也可以直接使用暴力求解法得解,虽然暴力求解法,也就是打擂台算法也可,但是 #其所需要计算的时间太多,没有考虑到我们的时间复杂度的问题 if len(rotateArray)==0: return 0 min=rotateArray[0] for i in rotateArray: if i<min: min=i return min
2.使用二分查找法求解,二分查找法的精髓并不是查找一个有序数列当中的某一个数值,而是通过把一个数组进行二分后,再进行查找的思想。因此我们将其修改为:
假设有一个数组:【3,4,5,1,2,3】
left是数组当中进行比较数组的最左边一个数字
right是数组当中进行比较数组当中最右边的一个数字
如果Mid小于了前面的数字,(1<5)那么我们找到了最小数字
我们的目的就是找到一个数字比前面的数字更小
后面的操作相当于不断改变查找数组长度的过程
如果mid小于了最后的数字,那么right=mid-1
如果mid大于了最后的数字,那么left=mid+1
这样不断地进行移位操作,也就是不断变化数组当中的left和right,最终就可以夹逼得到mid的数值小于了前面的数字,这样这个mid一定使我们所寻找到的最小的数字。
代码如下:
# -*- coding:utf-8 -*- class Solution: def minNumberInRotateArray(self, rotateArray): if len(rotateArray)==0: return 0 left=0 right=len(rotateArray)-1#-1这个操作非常玄乎.... while left<=right: mid=(left+right)//2 if rotateArray[mid]<rotateArray[mid-1]: return rotateArray[mid] elif rotateArray[mid]<rotateArray[right]: right=mid-1 elif rotateArray[mid]>rotateArray[right]: left=mid+1
得解也!