旋轉陣列的最小數字
問題描述:將乙個嚴格遞增的數字序列從第i個位置切分,將有半部分挪到左半部分,比如[1,2,3,4,5,6]->[3,4,5,6,1,2],輸出序列中最小的數字的位置
笨方法是從左到右掃瞄一遍,但是o(n)的複雜度肯定是不行的。
根據問題描述的性質可知,變換後的序列的第乙個數是大於最後乙個數的(不完全是這樣,特殊情況我在後面會說一下),可以借鑑一下二分查詢,即:先設定乙個最左的指標和乙個最右的指標,若兩指標中間的數大於左指標,則min數在右半區域,反之在左半區域。思路明確之後分析一下剛才說的特殊情況,即i=0時,有0個數被挪到了序列的左邊,這樣的話序列是嚴格遞增的,第乙個數小於最後乙個數,因此這種情況直接返回第乙個數就行了。
pyhton實現:
# coding:utf-8
# 旋轉陣列的最小數字
def min(datalist):
flag1 = 0
flag2 = len(datalist) - 1
if datalist == :
return false
elif datalist[flag1] < datalist[flag2]: # 特殊情況,此時數列嚴格遞增
return datalist[flag1]
else:
while flag1 +1 != flag2: # 當左指標剛好在相鄰的左側時結束迴圈
if datalist[(flag1+flag2)/2] > datalist[flag1]: # 兩指標中間數大於左數,min數在右側
flag1 = (flag1 + flag2) / 2 # 將左指標指向中間數
else:
flag2 = (flag1 + flag2) / 2 # 將右指標指向中間數
return flag2
datalist = [3,4,5,6,1,2]
print min(datalist)
面試題8 旋轉陣列的最小數字
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...
面試題8 旋轉陣列的最小數字
1.題目 把乙個陣列最開始的幾個數字移到陣列的末尾,稱為陣列的旋轉,輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1.分析 最簡單的解法是從左到右遍歷陣列,找出最小的,但是時間複雜度是o n 沒有利用上排序的特性。乙個遞增的排序陣列在旋轉之後,也是部...
面試題8 旋轉陣列的最小數字
題目描述 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1 indexmin初始化為index1是為了防止將排序陣列的前面0個元素搬到最後面 即排序陣列本身 function mi...