《劍指offer》面試題7 旋轉陣列的最小數字

2022-01-12 17:00:23 字數 1499 閱讀 8057

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

1.如果使用暴力查詢法,則可以迅速求解,但是使用這種方法絕對不可能通過面試,達不到面試官考察的要求,求解的方法如下:

class

solution:

defminnumberinrotatearray(self, rotatearray):

#write code here

#也可以直接使用暴力求解法得解,雖然暴力求解法,也就是打擂台演算法也可,但是

#其所需要計算的時間太多,沒有考慮到我們的時間複雜度的問題

if len(rotatearray)==0:

return

0 min=rotatearray[0]

for i in

rotatearray:

if imin=i

return min

2.使用二分查詢法求解,二分查詢法的精髓並不是查詢乙個有序數列當中的某乙個數值,而是通過把乙個陣列進行二分後,再進行查詢的思想。因此我們將其修改為:

假設有乙個陣列:【3,4,5,1,2,3】

left是陣列當中進行比較陣列的最左邊乙個數字

right是陣列當中進行比較陣列當中最右邊的乙個數字

如果mid小於了前面的數字,(1<5)那麼我們找到了最小數字

我們的目的就是找到乙個數字比前面的數字更小

後面的操作相當於不斷改變查詢陣列長度的過程

如果mid小於了最後的數字,那麼right=mid-1

如果mid大於了最後的數字,那麼left=mid+1

這樣不斷地進行移位操作,也就是不斷變化陣列當中的left和right,最終就可以夾逼得到mid的數值小於了前面的數字,這樣這個mid一定使我們所尋找到的最小的數字。

**如下:

#

-*- coding:utf-8 -*-

class

solution:

defminnumberinrotatearray(self, rotatearray):

if len(rotatearray)==0:

return

0 left=0

right=len(rotatearray)-1#

-1這個操作非常玄乎....

while left<=right:

mid=(left+right)//2

if rotatearray[mid]]:

return

rotatearray[mid]

elif rotatearray[mid]right=mid-1

elif rotatearray[mid]>rotatearray[right]:

left=mid+1

得解也!

劍指Offer面試題 7 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。這道題最直觀的解法並不難,從頭到尾遍歷陣列一次,我們就能找出最小的元素。這種思路的時間複雜度顯然是o n 但是這個思路沒有利用輸...

劍指offer 面試題11 旋轉陣列的最小數字

完整 位址 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。這道題目相對前面的比較複雜,坑比較多 此時用二分法解決,mi...

劍指Offer面試題11 旋轉陣列的最小數字

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