劍指Offer 6 旋轉陣列的最小數字

2021-10-06 09:42:32 字數 1145 閱讀 4753

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

暴力法:從頭到尾遍歷陣列一次,找出最小的元素。時間複雜度是o(n),這個思路沒有利用輸入的旋轉陣列的特性。

二分查詢法:

旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面的子陣列的元素都大於或者等於後面子陣列的元素。最小的元素剛好是這兩個子陣列的分界線。可以用二分查詢法實現o(logn)的查詢。

用兩個指標分別指向陣列的第乙個元素和最後乙個元素,第乙個元素應該是大於或者等於最後乙個元素的。找到陣列中間的元素。如果中間元素位於前面的遞增子陣列,應該大於或者等於第乙個指標指向的元素。此時陣列中最小的元素應該位於該中間元素的後面。可以把第乙個指標指向該中間元素,縮小尋找的範圍。移動之後的第乙個指標仍然位於前面的遞增子陣列之中。同樣,如果中間元素位於後面的遞增子陣列,那麼應該小於或者等於第二個指標指向的元素。該陣列中最小的元素應該位於中間元素的千公尺那。把第二個指標指向該中間元素,縮小尋找的範圍。

# -*- coding:utf-8 -*-

class solution:

def minnumberinrotatearray(self, rotatearray):

length = len(rotatearray)

if length == 0:

return 0

if length == 1:

return rotatearray[0]

left, right = 0, length- 1

while left<= right:

mid = (left+ right) >> 1

if rotatearray[mid] > rotatearray[right]:

left = mid+ 1

elif rotatearray[mid] < rotatearray[right]:

right = mid

else:

right -= 1

if left >= right:

break

return rotatearray[left]

劍指Offer 6 旋轉陣列的最小元素

description把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。可以直接binary search,每次mid和r的...

劍指offer(6) 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。這道題最直觀的解法並不難,從頭到尾遍歷陣列一次,我們就能找出最小的元素。這...

劍指Offer (6)旋轉陣列的最小數字

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。實現如下 l m r 規律 一般前旋轉區的數大於等於後旋轉區的...