vlambda博客
学习文章列表

旋转数组最小值二分查找法

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

# -*- coding:utf-8 -*-

class Solution:

    def minNumberInRotateArray(self, rotateArray):

        # write code here

        #利用二分查找法查找时,若right < middle ,则意味着右侧数据违背了元素递增的规律,即最小值一定在Middle往后的数据中,left = mid +1

        #若right > middle,则意味着middle之后的数据是递增规律,则最小值一定在middle的前面,即right = middle-1


        if not rotateArray:

            return 0

        l = len(rotateArray)

        left = 0

        right = l-1

        while left <= right:

            mid =(left + right)>>1     

            if rotateArray[mid-1]>rotateArray[mid]:

                return rotateArray[mid]

            elif rotateArray[mid] > rotateArray[right]:

                left = mid +1

            else:

                right = mid -1

        return 0


mid 表示用右移1位比除以2更高效,节约大约一半的运行时间


ps:今天的心情还算比较不错,手机免费换了个屏幕,在碎屏险的保修期内。5.17号来学校那天送去的,今天拿到贴了钢化膜,换了手机壳,感觉又跟换了个新手机一样。说说最近的减肥心得吧,米饭该少吃还是要少吃,毕竟全是碳水化合物,哈哈哈哈。今天中午没有吃白米饭,吃完是觉得没有饱,睡觉的时候还觉得有点意犹未尽。但是两点钟 午睡结 束的时候,身体已经没有任何的感觉了,还觉得十分舒服。昨天说的8+16减肥法也可以试一哈,感觉自己像是一个 to c 的产品,每天都在不断的迭代。这次来学校,很多人都说我瘦了,穿以前的衣服确实也能感觉的出来。所以更加有动力去保持。前一周每天十点离开实验室,回去运动半个小时,然后洗澡睡觉,昨天晚上吃多了,停了一天。今天在想中午回去有大段的时间可以尝试运动完了再吃中饭。
        之前觉得食堂的菜油腻了,不给自己找借口,要找方法。就用开水泡几遍。对吃的食物做个测评:两荤一素(多了),一荤两素,不加米饭(可),一荤一素,不加米饭(少了),吃点其他代餐如燕麦,鸡胸肉。
        今天应该算是难得的好心情,要开心更要加油啊。
最近的规划觉得还不错,在学校的效率比在家也好很多,除了学习就是锻炼。之前觉得是在家的时间荒废了,其实也没有,休息是为了更好的学习和工作。自己也不是一无所获嘛。