把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
1.如果使用暴力查詢法,則可以迅速求解,但是使用這種方法絕對不可能通過面試,達不到面試官考察的要求,求解的方法如下:
classsolution:
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...