美文网首页
剑指Offer 6 :旋转数组中的最小数字

剑指Offer 6 :旋转数组中的最小数字

作者: clshinem | 来源:发表于2017-05-18 19:15 被阅读0次
题目:

讲道理,这个总需要解释下旋转数组是什么
比如{3,4,5,1,2} 是{1,2,3,4,5}的一个旋转
就酱

顺着找是O(n),既然是两边都有序,那么我们类二分的找一下
大致就是二分的思路
两个指针,一个头一个尾,如果mid比第一个大,那么是前面那个有序数组的,要找的最小的肯定在右边,所以前面的移到mid如果mid小于第二个,那么后面的移到mid

找到的条件是两个指针的距离为1

注意

可能是一个全部有序的数组
还有可能 1 0 1 1 1这样,不知道这个1是前面的还是后面的,遇到这样的情况只能顺序查找了
代码:

def minNumberInRotateArray(rotateArray):
        i,j = 0,len(rotateArray)-1
        mid = 0
        while rotateArray[i] >= rotateArray[j]:
            if j - i == 1:
                mid = j
                break
            mid = (i + j) / 2
            if rotateArray[i] == rotateArray[mid] and rotateArray[j] == rotateArray[mid]:
                mid = minNumber(rotateArray)
                break
            if rotateArray[i] <= rotateArray[mid]:
                i = mid
            elif rotateArray[mid] <= rotateArray[j]: # 这一点刚开始写错了,没有和后面那个比较,想简单了,只和前面的比了
                j = mid
        return rotateArray[mid]

def minNumber(rotateArray):
    if len(rotateArray) == 0:
        return 0
    if len(rotateArray) == 1:
        return rotateArray[0]
    for i in range(0,len(rotateArray)):
        if rotateArray[i] < rotateArray[i-1]:
            return i

然后决定用python开一下挂

    def minNumberInRotateArray(self,rotateArray):
        if len(rotateArray) == 0:
            return 0
        sort(rotateArray)
        return rotateArray[0]

当我以为我开了挂的时候,网上的大神教会了我做人🙋

def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray) == 0:
            return 0
        return min(rotateArray)

相关文章

网友评论

      本文标题:剑指Offer 6 :旋转数组中的最小数字

      本文链接:https://www.haomeiwen.com/subject/fntexxtx.html