旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
【1】二分查找
先判断第一个值是不是大于最后一个值?若是,则有序,直接返回第一个值;若不是,else:
指针p指向位置0,指针q指向位置n,指针i指向中间位置 (q+p)/2 向下取整
若i值大于p值,说明i在前一段,要找的数在i后面,要移动p,使p=i,i=(q+p)/2
若i值小于q值,说明i在后一段,要找的数在i前面,要移动q,使q=i,i=(q+p)/2

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        length = len(rotateArray)
        if length==0:
            return 0
        elif rotateArray[0] < rotateArray[-1]:
            return rotateArray[0]
        else:
            p = 0 
            q = length-1
            i = (p+q)/2
            while(p<=q):
                if q-p == 1:
                    i = q
                    break   # 此处重要
                i = (p+q)/2
                
                if rotateArray[i] == rotateArray[p] == rotateArray[q]:
                    return self.ordersearch(rotateArray, p, q)  # 此处重要
                
                if rotateArray[i]>=rotateArray[p]:
                    p = i
                elif rotateArray[i]<=rotateArray[q]:
                    q = i
            return rotateArray[i]
    def ordersearch(self, A, left, right):
        res = A[left]
        for i in range(left, right + 1):
            res = min(res, A[i])
        return res

特殊情况
[1,0,1,1,1]和[1,1,1,0,1]都是[0,1,1,1,1]的旋转,这两种情况中,p 和 q 指向的数字都是1,并且i指向的也是1,即array[p]==array[q]==array[i]
在[1,0,1,1,1]中,i之间的1在后一段;在[1,1,1,0,1]中,i指向的1在前一段。

【2】顺序查找

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        length = len(rotateArray)
        if length==0:
            return 0
        else:
            res = rotateArray[0]
            for num in rotateArray:
                if num < res:
                    return num
            return res
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray)==0:
            return 0
        else:
            res = rotateArray[0]
            for num in rotateArray:
                if num<res:
                    return num
            return res

下面这种方法,比较的是前后相邻两个,需要吗,把顺序与第一个值比较不行?反正前一段是you

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        pre = -7e20
        for num in rotateArray:
            if num < pre :
                return num
            pre = num
             
        if len(rotateArray) == 0:
            return 0
        return rotateArray[0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值