劍指offer 陣列的旋轉(1)Python實現

2021-08-30 21:39:55 字數 1475 閱讀 6450

題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為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...