題目:把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{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]