剑指offer_面试题11 : 旋转数组的最小数字( python实现 )

旋转数组的最小数字( python实现 )

一、题目描述

题目:查找旋转数组的最小数字
把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 {3,4,5,1,2} 为 {1,2,3,4,5,} 的一个旋转,该数组的最小值为1。

二、解题思路

  暂略。(此处主要作为书中python实现补充)

三、代码实现

  这里主要实现二分查找的方式,与顺序查找相比,其时间复杂度由 O ( n ) O(n) O(n)降低到 O ( l o g n ) O(logn) O(logn)。当然,在某些特殊情况下,可能需要进行进一步的处理,具体Python代码实现如下。

def searchMin(myList):
    # 判断是否为空数组
    if len(myList) == 0:
        return False
    # 初始化
    index_fore = 0
    index_back = len(myList) - 1
    index_mid = index_fore
    # 若是出现旋转后的数组为 [1 0 1 1 1],或者[1 1 1 0 1],只能采用顺序查找的方式
    if myList[index_fore] == myList[index_back] and myList[index_fore] == myList[index_mid]:
        result = myList[index_fore]
        for i in range(len(myList)):
            if result > myList[i]:
                result = myList[i]
        return result
    # 正常数组的情况下,采用二分查找
    while myList[index_fore] >= myList[index_back]:
        if index_back - index_fore == 1:
            index_mid = index_back
            break
        index_mid = int((index_fore + index_back)/2)
        if myList[index_mid] <= myList[index_back]:
            index_back = index_mid
        elif  myList[index_mid] >= myList[index_fore]:
            index_fore = index_mid
    return myList[index_mid]
>>> myList = [3,4,5,1,2]
>>> searchMin(myList)
Out:
1

  在以下这种特殊的输入情况下,其最左边的元素、最右边的元素及中间的元素都相等。采用二分查找的方式无法正确查找到最小值,因此只能退化为采用顺序查找的方式,其时间复杂度由原来的 O ( l o g n ) O(logn) O(logn)增长到 O ( n ) O(n) O(n)

>>> myList = [1,0,1,1,1]
>>> searchMin(myList)
Out:
0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值