【剑指offer】旋转数组的最小数字

二分查找(Binary Search):每次查找都把旋转数组平均分成两部分,通过比较当前旋转数组两端点中间点的值,判断最小值在数组的哪一部分,从而达到缩小搜索范围的目的。其中,两端点为当前的旋转数组索引最小索引最大的元素,中间点为这两部分子数组的连结元素,也可以看做为轴枢点(pivot point),这里取旋转数组的最小索引和最大索引的算术平均值(向下取整)作为索引,其对应的元素作为中间点

按照上述的思路,第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最终第一个指针将指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素。也就是它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素。这就是循环结束的条件。

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        if not rotateArray:return 0
        low, high = 0, len(rotateArray)-1
        while low < high - 1:
            mid = (low+high)//2
            if rotateArray[mid-1] > rotateArray[mid]:
                return rotateArray[mid]
            elif rotateArray[low] > rotateArray[mid-1]:
                high = mid
            else:
                low = mid
        return rotateArray[0]

emmm有点上述太复杂了

利用二分的性质很好做

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if not nums:return 0
        l=0
        r=len(nums)-1
        while l<r:
            mid = l+r>>1
            if nums[mid]<=nums[-1]:r=mid
            else:l=mid+1
        return nums[r]

参考:旋转数组的最小数字(C++ 和 Python 实现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值