剑指offer——06旋转数组的最小数字(Python3)

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

NOTE:给出的全部元素都大于0,若数组大小为0,请返回0。指针

知识点:查找(二分查找)code

思路:排序

题上说明数组是一个旋转的非减排序数组,即1:参数数组为一个有序非递减数组;2.数组旋转后分为两部分,即原始位置和旋转位置。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,则{3,4,5}为原始数组,{1,2}为旋转数组。咱们能够利用二分查找,设置两个指针来查找原始数组的尾部和旋转数组的头部,进而断定最小位置。it

若是中间位置位于原始数组,那么它应该大于等于头指针,此时数组中最小的元素应该位于该中间元素的后面;若是中间元素位于后面的旋转数组,那么它应该小于等于尾指针,此时该数组的最小元素应该位于该中间元素的前面。io

最终头指针会指向原始数组的尾部,尾指针会指向旋转数组的头部。class

若是遇到头指针、尾指针和中间元素相等的状况,即{1,0,1,1,1},没法判断,只能利用顺序查找方法。循环

代码:方法

class Solution:    def minNumberInRotateArray(self, rotateArray):        '''        :param rotateArray: 输入的旋转数组        :return: 数组中的最小值        '''        # write code here        #设置两个指针,指向数组下标        index_1 = 0#设置头指针        index_2 = len(rotateArray) - 1#设置尾指针        min = index_1        #尾指针始终指向后面的递增数组,头指针始终指向前面的递增数组        #最终头指针指向前面数组的最后一个元素,尾指针指向后面数组的最后一个元素        while rotateArray[index_1] >= rotateArray[index_2]:#当头指针超过尾指针时,跳出循环            if index_2 - index_1 ==1:#判断输出条件                min = index_2                break            min = int((index_1+index_2)/2)#找出中间元素            #没法判断位置时,(当头指针、尾指针和中间相同时)采用顺序查找            if rotateArray[index_1] ==rotateArray[index_2] and rotateArray[index_1]==rotateArray[min]:                for i in range(index_1, index_2 + 1):                    if rotateArray[i] < rotateArray[min]:                        min = i                    return rotateArray[min]            #开始使用二分查找            if rotateArray[index1] <= rotateArray[min]:                index1 = min            elif rotateArray[min] <= rotateArray[index2]:                index2 = min        return rotateArray[min]
相关文章
相关标签/搜索