剑指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]<rotateArray[i]:
                return 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]<mmin:
                mmin = rotateArray[i]
        return mmin

递归

二分思路的递归解法。

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+1])
        elif rotateArray[mid]>rotateArray[0]:
            return self.minNumberInRotateArray(rotateArray[mid:])
        else:
            return self.minNumberInRotateArray(rotateArray[1:])

写在后面

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值