旋转数组的最小值

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

递增数组(非严格)可以通过二分查找来解决问题,非严格递增需要顺序查找,旋转数组分为两个部分,第一部分的数字比第二部分的数字大,跳出迭代的条件是左右指针相邻,如果左边部分比右边部分小,说明数组没有旋转,这个时候直接返回数组第一个元素即可

class Solution:
    def get_min(self, seq):
        if not seq:
            raise Exception("input wrong")
        length = len(seq)
        index_1 = 0
        index_2 = length - 1
        index_mid = index_1
        while seq[index_1] >= seq[index_2]:
            if index_2 - index_1 == 1:
                index_mid = index_2
                break
            index_mid = (index_2 + index_1) // 2
            if seq[index_1] == seq[index_2] and seq[index_2] == seq[index_mid]:
                return self.get_min_inorder(seq, index_1, index_2)
            if seq[index_mid] <= seq[index_1]:
                index_2 = index_mid
            elif seq[index_mid] >= seq[index_2]:
                index_1 = index_mid
        return seq[index_mid]
    
    def get_mid_inorder(self, seq, index_1, index_2):
        result = index_1
        for i in range(index_1+1, index_2+1):
            if seq[i] < seq[result]:
                result = i
        return seq[result]

你可能感兴趣的:(旋转数组的最小值)