剑指offer-旋转数组的最小数字python

旋转数组的最小数字

  • 题目
  • 暴力解法
  • 二分法
  • 递归
  • 写在后面

题目

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

暴力解法

直接for遍历数组,如果有一个元素大于其后面的一个元素,这就是断点,后面元素就是最小值。

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:
            return 0
        for i in range(len(rotateArray)-1):
            if rotateArray[i+1]

二分法

有序数组一般也可用二分查找。这里也可借助二分查找的思想,不同的是需要比较左右端点与中间值的大小。如果左端点大于中间值,说明断点在左边部分,否则在右边部分。
由于是旋转数组,最后缩小到最小的数组大小为2,且数组中第一个元素为数组中值较大的元素,第二个元素是数组中值较小的元素,那么最小值就是第二个元素。
还有一点需要考虑的是数组中有重复元素时的情况,比如[1,1,1,0,1],这种用暴力法得到断点处的最小值。

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:
            return 0
        l = 0
        r = len(rotateArray)-1
        while l<=r:
            if r-l == 1:
                return rotateArray[r]
            mid = (l+r)//2
            if rotateArray[l] == rotateArray[mid] and rotateArray[mid] ==rotateArray[r]:
                return self.getMin(rotateArray,l,r)
            if rotateArray[l]<=rotateArray[mid]:
                l = mid
            elif rotateArray[l]>=rotateArray[mid]:
                r = mid
        return rotateArray[r]
        
    def getMin(self,rotateArray,l,r):
        mmin = rotateArray[l]
        for i in range(l,r+1):
            if rotateArray[i]

递归

二分思路的递归解法。

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if not rotateArray:
            return 0
        if len(rotateArray) == 2:
            return rotateArray[1]
        
        mid = len(rotateArray)/2
        if rotateArray[mid]rotateArray[0]:
            return self.minNumberInRotateArray(rotateArray[mid:])
        else:
            return self.minNumberInRotateArray(rotateArray[1:])

写在后面

现在看来这题跟网易面试题-在环形有序数组中查找给定数有异曲同工之处,可惜自己当时刷题的时候用暴力法通过后就完事了,没有考虑优化的解法,导致面试的时候遇到不会自己吃亏了。所以刷题还是要好好地刷,认真地想可以优化的方法,笔试或面试遇到的算法题其实应该都差不多,有值得借鉴的思路。

你可能感兴趣的:(算法)