美文网首页
剑指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