剑指offer(6)旋转数组的最小数字

本文介绍了一种在旋转数组中寻找最小数值的高效算法。通过利用数组特性,采用二分查找法,能够在logn时间内定位到数值突变点,从而找到最小值。文章详细解析了算法实现过程,并提供了Python代码示例。

找一个数组里头最小的数字
最简单的方法就是O(N)啦
一个一个找过去就行了
我想到的好点的方法是logn
使用二分查找
这样可以利用已经给的信息:数组前一部分是递增的后半部分是递减的
目标:找到递增递减突变的点
如果可以画出函数求导图的话…那个点就很明显…
不扯了…进入正题…
所以使用二分查找
这里和普通二分查找不同的地方是,普通二分查找要找的是一模一样的元素
此处要找的是突变点
记start(s)为待查找数组的首下表,end(e)为尾下标,mid=(s+e)/2即中值
如果说arr[s]>arr[0] 同时arr[mid]<arr[0]同时m-s=1 很明显,mid为突变点
如果arr[mid]>arr[0]同时arr[e]<arr[0]同时e-m=1很明显,e为突变点
ojbk 码代码把

class Solution:

    def minNumberInRotateArray(self, rotateArray):  # 题意版本,利用从小到大的信息,使用二分查找
        len1=len(rotateArray)
        if (len(rotateArray) == 0):
            return 0
        if (len(rotateArray) == 1):
            return rotateArray[0]
        s=0
        e=len1-1
        mid=(int)((s+e)/2)
        while(True):
            if(rotateArray[mid]>=rotateArray[0]):
                s=mid
                if(rotateArray[e]<rotateArray[0] and e-1==mid):
                    return rotateArray[e]
            elif(rotateArray[mid]<rotateArray[0]):
                e=mid
                if(rotateArray[s]>rotateArray[0] and mid-1==s):
                    return rotateArray[mid]
            mid = (int)((s + e) / 2)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值