《剑指offer》面试题7:旋转数组的最小数字

 题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{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
得解也!
原文地址:https://www.cnblogs.com/geeksongs/p/13475716.html