題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。
考點:二分查詢 鏈結
一、鏈結二。
分析:旋轉之後的陣列實際上可以劃分成兩個有序的子陣列:前面子陣列的大小都大於後面子陣列中的元素。注意到實際上最小的元素就是兩個子陣列的分界線。本題目給出的陣列一定程度上是排序的,因此可以試著用二分查詢法尋找這個最小的元素。
思路:如果用順序排序,複雜度為o(n)。
這題給出了排序陣列,明顯要用到這個條件。二分查詢法複雜度為o(logn)。
非遞減排序陣列的旋**
1 2 3 4 5 *****= 1 2 3 4 5 未發生旋轉 array[low] < array[high]
1 2 3 4 5 *****= 3 4 5 1 2 發生旋轉 array[low]>=array[high] 二分查詢
0 1 1 1 1 *****= 1 1 1 0 1 ***** 1 0 1 1 1 array[low]==array[high]==array[mid] 順序查詢
另外還兩種特殊的情況:
1.當陣列長度為0時,返回0。
2.當陣列只有乙個元素時,返回那個元素。
還要注意一種情況,當mid同時小於low 和 high 對應的元素時,只能順序查詢
# -*- coding:utf-8 -*-
class solution:
def minnumberinrotatearray(self, rotatearray):
# write code here
if len(rotatearray) == 0: #當長度為0時
return 0
if len(rotatearray) == 1: #當長度為1時
return rotatearray[0]
length = len(rotatearray)
start = 0
end = length - 1
mid = (start+end) >> 1 #python中》 右移,右移1位相當於除以2.
if rotatearray[start] == rotatearray[mid] and rotatearray[start] == rotatearray[end]:
return min(rotatearray) #順序查詢
while end - start > 1 : #說明陣列中元素大於1
mid = (start+end) >> 1 #二分查詢
if rotatearray[mid] >= rotatearray[start]:
start = mid
else:
end = mid
return rotatearray[end]
劍指offer陣列1
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。引數 numbers 乙個整數組 length 陣列的長度 dupl...
劍指Offer08 陣列旋轉問題
把乙個陣列最開始的若干個元素搬到陣列末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出陣列最小的元素。例如陣列為的乙個旋轉,該陣列的最小值為1。採用二分法的思路,設定兩個指標分別指向陣列的第乙個元素和最後乙個元素。第乙個元素應該是大於或者等於最後乙個元素的,存在特例 找到陣列中間的元...
Python劍指offer 旋轉陣列的最小數字
由旋轉陣列的定義可以知道,最小數字既要小於左邊的數又要小於右邊的數 另外因為陣列是非減排序的,所以陣列的原始狀態下一定是右邊的數大於中間的數大於左邊的數。利用二分查詢的思想,要想找到這個最小數說明順序陣列其中某個地方有個斷崖,所以旋轉陣列的最小數說明它是小於左邊的數的第乙個,也就是如果 rotate...