劍指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]
相關文章
相關標籤/搜索