題目:把乙個陣列的最開始幾個元素搬到陣列的末尾,叫做陣列的旋轉。輸入乙個遞增陣列的旋轉,找出其最小元素,例如陣列a是陣列b的乙個旋轉,輸入陣列a後,輸出最小元素應該為1
此題最直觀的解法,從頭到尾遍歷陣列,當第n個元素比第n-1個元素小時,第n個元素即為陣列的最小元素。此法所需時間複雜度為o(n)
注意到在有序陣列中查詢某個數字的時候是可以用二分查詢將時間複雜度降為o(logn)的,本題也在一定程度上屬於有序陣列。
如上圖,首先宣告兩個指標p1,p2分別指向陣列的首尾元素3和2,以及pmid指標指向p1和p2的中間元素5。
比較pmid和p2指向元素的大小,如果pmid的元素較大,則表明陣列的最小元素一定在pmid的右邊,將p1放到pmid的位置。否則的話最小元素一定在pmid的左邊(也有可能是pmid自己),將p2放到pmid的位置。
此處情況為前者,所以將p1放到pmid的位置(圖b)
之後找到pmid元素為1,比p2的元素小,所以陣列最小值一定在pmid的左邊或者是它本身。但是此時它的左邊為p1,已經沒有元素了,因此最小元素為其自身。
似乎已經能夠找到解決辦法了,但是還可以再關注一些特殊情況。
當輸入陣列為空指標,自然不應該返回有效值,此時可以報錯或者返回乙個-9999的無效值。
當輸入陣列只有1個元素,直接返回該陣列即可。
當陣列沒有旋轉,也算是乙個有效輸入,此時應該直接返回第乙個元素即可。當沒有旋轉時,指標p1應該比p2小,所以在程式一開始時即可判斷p1p2大小來確定陣列有沒有旋轉。
最後是當陣列有多個元素相同時,如上圖這種情況的話,p1、p2和pmid將是完全一樣,此時無法判斷陣列的最小元素位於何處。因此如果碰到這種情況的話只能通過順序查詢來處理。
**如下:
本題**在這裡int
mininorder
(int array,
int p1,
int p2)
return result;
}int
minnumberinrotatedarray
(int array,
int len)
if(len==1)
return array[0]
;int p1 =0;
int p2 = len -1;
if(array[p1]
< array[p2]
)return array[p1]
;//陣列並沒有旋轉,返回第乙個元素
int pmid =
(p1 + p2)/2
;while
(true
)else
}}
劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...
劍指offer 旋轉陣列的最小數字
記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...