剑指Offer-Python-牛客网

面试题11:旋转数组的最小数字

2019-01-05  本文已影响0人  凌霄文强

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

知识点

排序,折半查找


Qiang的思路

对于这道题,如果不管是不是排序,旋转之类的,直接通过遍历就能得到结果,但是显然这样做就没什么意义了。同样也说明,这道题考察的是如何将时间复杂度降低。遍历的时间复杂度为O(n),因为排好序了,所以可以使用折半查找,时间复杂度为O(logn)。

我们能够发现数组一共有三种情况:

对于第一种情况,只需要返回0即可。对于第二种情况只需要返回第一个值即可,此时第一个元素一定小于最后一个元素。对于第三种情况才是需要使用递归执行的。

既然想使用折半查找的办法去做,那么首先要分析一下中间值的特点。显然,中间值可能有几种情况:

组合一下上面的五种情况:

所以能写出如下的代码:

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray)==0:
            return 0
        while rotateArray[0]>=rotateArray[-1]:
            if len(rotateArray)==2:
                return min(rotateArray)
            mid=int(len(rotateArray)/2)
            if rotateArray[0]==rotateArray[-1] and rotateArray[0]==rotateArray[mid]:
                return min(rotateArray)
            if rotateArray[mid]>=rotateArray[0]:
                rotateArray=rotateArray[mid+1:]
            elif rotateArray[mid]<=rotateArray[-1]:
                rotateArray=rotateArray[:mid+1]
        return rotateArray[0]

这个问题中有几点需要注意:


作者原创,如需转载及其他问题请邮箱联系:lwqiang_chn@163.com
个人网站:https://www.myqiang.top

上一篇 下一篇

猜你喜欢

热点阅读