旋轉數字的最小數字

2021-09-26 22:38:30 字數 1574 閱讀 7384

題目描述

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

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

自己的思路

拿到題目,第一眼看上去就感覺怪怪的,這不就是乙個求陣列的最小值嗎,直接遍歷,o(n)走起,那這跟陣列的旋轉不旋轉有毛關係呢,這也能上《劍指offer》?雖然抱著懷疑的態度,還是按照自己的第一直覺把**碼完了,提交,居然a了,我嚴重懷疑這個測試系統有問題,但是的確是a了,我能說啥,可能自己也喜歡偷懶,a了就想思考下去了,這樣可不行啊,面試官可不會覺得麻煩就不讓你說了。還是先把自己偷懶的**貼出來吧,毫無技術含量可言。

class solution 

int min = rotatearray[0]

;for

(int i=

1;isize()

;++i)

}return min;}}

;

大佬的思路

由於沒有仔細思考,這是乙個非遞減陣列,沒有必要從頭到尾遍歷,大佬注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,採用二分查詢(當然這不是普通的有序數的二分查詢,而是採用了它折半的思想),時間複雜度只有o(logn),這個寫出來,應該是能得到面試官的青睞的。

需要考慮三種情況:

a. rotatearray[mid] > rotatearray[high]

出現這種情況的rotatearray類似,此時最小數字一定在mid的右邊。

low = mid + 1;

b. rotatearray[mid] == rotatearray[high]

出現這種情況的array類似或者,此時最小數字不好判斷在mid左邊還是右邊,只好乙個乙個試。(往high的左邊找準沒錯)

high = high - 1;

c. rotatearray[mid] < rotatearray[high]

出現這種情況的array類似,此時最小數字一定就是rotatearray[mid]或者在mid的左邊(要麼是沒有旋轉,要麼只剩兩個比較元素了),因為右邊必然都是遞增的。

high = mid;

注意這裡有個坑:如果待查詢的範圍最後只剩兩個數,那麼mid一定會指向下標靠前的數字。

比如array =

rotatearray[low] = 4 ;rotatearray[mid] = 4 ; rotatearray[high] = 6 ;

如果high = mid - 1,就會產生錯誤, 因此high = mid,但情形a中low = mid + 1就不會錯誤

上**

class solution 

else

if(rotatearray[mid]

== rotatearray[high]

)else

}return rotatearray[low];}

};

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...

旋轉陣列最小數字

旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...

旋轉陣列的最小數字

1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...