剑指offer:旋转数组的最小数字

链接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba
来源:牛客网

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

参考了好几个解答方法,暴力破解排除在外,用二分查找法

首先以递增排序的数组的旋转作为例子来理解,则这个旋转是两个递增有序的数组。

low,mid,high分别指向第一个,中间位置的数和最后一个数
由于一定是将较小的部分数组旋转到了较大的数组之后,前面的元素一定比后面大,但可以通过中间元素和两边边界的元素大小比较来判断最小值在哪里

(1)array[mid] > array[high]
当中间元素比后面的元素大,说明最小值应该在[mid+1,high]之间,中间元素比后面大,即前若干个较小的数的最后一个比当前中间元素要小,因此最小值还在中间元素的后面。
因此使 low = mid + 1

(2)array[mid] < array[high]
同理,中间值如果比最后一个元素小,说明最小值在[low,mid]之间
使high = mid

迭代直到low==high,即只剩一个值时为最小值。

再来考虑非递增的序列,即元素有重复值的数组,这种时候很有可能只有一个最小值,其他元素都一样,这时只能一个一个查找
high = high -1
依次向下迭代,当遇到最小值时就会一直选择这个值与其他值进行对比再缩减比较范围

用python写本来想用递归,但是基础不好,写出来递归得不到正确答案,只好改成了迭代

**# -*- coding:utf-8 -*-**
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray)==0:
            return 0
        low = 0
        high = len(rotateArray)-1
        mid = (low+high)/2
        if len(rotateArray)==1:
            return rotateArray[low]
        if len(rotateArray)==2:
            a = rotateArray[0]
            b = rotateArray[1]
            return a if arotateArray[high]:
                low = mid+1
            elif rotateArray[mid]<=rotateArray[high]:
                high = mid
        return rotateArray[low]

你可能感兴趣的:(剑指offer刷题)