剑指offer 面试题11 (旋转数组的最小数字) python

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

 

代码(一):

# -*- coding:utf-8 -*-

class Solution:

    def minNumberInRotateArray(self, rotateArray):

        # write code here

        return min(rotateArray)

 

代码思路:遍历。把所有数都过一遍找出最小的。但是 问题是:时间复杂度为O(n)

 

 

代码(二):

# -*- coding:utf-8 -*-

class Solution:

    def minNumberInRotateArray(self, rotateArray):

        # write code here

        if not rotateArray:

            return None

            if rotateArray[0]<rotateArray[-1]:

                return rotateArray[0]

        else:

            ind_1 = 0

            ind_2 = len(rotateArray)-1

            while ind_1<ind_2:

                mid =ind_1 + (ind_2 - ind_1)//2

                if rotateArray[ind_1]<=rotateArray[mid]:

                    ind_1 = mid

                else:

                    ind_2 = mid

                if (ind_1 + 1) == ind_2:

                    return min(rotateArray[ind_1],rotateArray[ind_2])

 

 

代码思路:除了在原状态就是没有旋转或者旋转回原本的顺序的时候,这时候 直接提取第一个元素就可以了。

其余情况,我们可以把数列看成两部分。{3,4,5,1,2}两个递增序列:{3,4,5}{1,2}。我们可以看到有旋转以后的序列第一个元素一定会比最后一个大。

因此,我们设立两个指针,第一个指针指向begin=0下标,第二个指针指向最后一个end=4下标。然后新指针为mid=(4-0)//2 取半,比较 begin mid ,如果mid更大,begin=mid;如果mid小于end,end=mid。因此栗子从{3,4,5,1,2}变为{5,1,2}  指针范围内的值。重复直到end和begin差一,两者中最小的就是我们要找的值了。

猜你喜欢

转载自blog.csdn.net/chocolate_chuqi/article/details/81104400