把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。
旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,且前面的子陣列的元素都大於或者等於後面子陣列的元素。最小的元素恰好是這兩個子陣列的分界線。在排序的陣列中我們可以用二分查詢法實現o(logn)的查詢。
和二分查詢一樣,我們用兩個變數(index_start,index_end)分別指向陣列的第乙個元素和最後乙個元素。如果中間元素位於前面的遞增子陣列,那麼它應該大於等於index_start所指向的元素,此時陣列中最小的元素應該位於中間元素的後面。我們可以把index_start指向該中間元素,縮小查詢的範圍。同樣,如果中間元素位於後面的遞增子陣列,那麼它應該小於等於index_end所指向的元素,此時陣列中最小的元素應該位於中間元素的前面。我們可以把index_end指向該中間元素。最終index_start會指向前面子陣列的最後乙個元素,index_end會指向後面子陣列的第乙個元素,也就是說,它們最終會指向兩個相鄰的元素,而index_end指向的元素剛好就是陣列的最小元素。
# -*- coding:utf-8 -*-
class
solution:
defminnumberinrotatearray
(self, rotatearray):
# write code here
if len(rotatearray) == 0:
return
0 index_start = 0
index_end = len(rotatearray) - 1
index_mid = index_start # 考慮旋轉陣列與原陣列一致
while (rotatearray[index_start] >= rotatearray[index_end]):
if (index_end - index_start == 1):
index_mid = index_end
break
index_mid = (index_end + index_start) / 2
if (rotatearray[index_mid] < rotatearray[index_end]):
index_end = index_mid
# 考慮類似[1, 0, 1, 1, 1],[1, 1, 1, 0, 1]的情況
elif (rotatearray[index_mid] == rotatearray[index_end]):
index_end -= 1
else:
index_start = index_mid
return rotatearray[index_mid]
c 刷題 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。遍歷陣列,找到第乙個比上乙個元素小的元素,返回該元素。class sol...
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...