旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

算法分析

1.最首先想到的思路就是遍历数组,直到找到一个数比前面一个数小,则输出这个数,算法的时间复杂度为O(n)。
2.其实可以想到利用二分的思想进行优化:
(1)首先计算mid = (start + end) / 2
(2)若mid上的值比start的值小,则说目标在mid的左边;若mid的值比end上的值大,则说明目标在mid的右边;否则可以将end - 1来缩小范围。此处需要注意不可以用start + 1来替代end - 1,因为我们找的时候是要发现前面的数大于后面的数,所以不能丢失前面的信息。

代码

class Solution(object):
    def minArray(self, numbers):
        start = 0
        end = len(numbers) - 1
        while start <= end:
            mid = (start + end) // 2
            if mid - 1 >= start and numbers[mid - 1] > numbers[mid]:
                return numbers[mid]
            elif mid + 1 <= end and numbers[mid + 1] < numbers[mid]:
                return numbers[mid + 1]
            if numbers[mid] < numbers[start]:
                end = mid - 1
            elif numbers[mid] > numbers[end]:
                start = mid + 1
            else:
                end -= 1
        return numbers[0]
posted @ 2020-03-22 11:04  isshpan  阅读(131)  评论(0)    收藏  举报