1. 程式人生 > >劍指offer——06旋轉陣列的最小數字(Python3)

劍指offer——06旋轉陣列的最小數字(Python3)

題目:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。

NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

知識點:查詢(二分查詢)

思路:

題上說明陣列是一個旋轉的非減排序陣列,即1:引數陣列為一個有序非遞減陣列;2.陣列旋轉後分為兩部分,即原始位置和旋轉位置。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,則{3,4,5}為原始陣列,{1,2}為旋轉陣列。我們可以利用二分查詢,設定兩個指標來查詢原始陣列的尾部和旋轉陣列的頭部,進而判定最小位置。

如果中間位置位於原始陣列,那麼它應該大於等於頭指標,此時陣列中最小的元素應該位於該中間元素的後面;如果中間元素位於後面的旋轉陣列,那麼它應該小於等於尾指標,此時該陣列的最小元素應該位於該中間元素的前面。

最終頭指標會指向原始陣列的尾部,尾指標會指向旋轉陣列的頭部。

如果遇到頭指標、尾指標和中間元素相等的情況,即{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[mi