把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。
解題方法一:暴力查詢
非遞減陣列旋轉之後最小值,也就是尋找分界點,分界點前後都是非遞減陣列,分界點後面的非遞減陣列比分界點前面的陣列都要小,因此對旋轉陣列按順序查詢,當出現後乙個數比前乙個小時,這個數就是最小值,若沒有出現後乙個數比前乙個數小的情況,這說明這個陣列所有的數都相等,返回陣列第乙個數即可。注意考慮陣列為空的情況,返回0
class solution
return tem;}};
解題方法二:二分查詢
同二分查詢法一樣,我們用兩個指標分別指向陣列的第乙個元素和最後乙個元素。按照旋轉規則,第乙個元素應該大於等於最後乙個元素。接著可以找到陣列中間的元素。如果中間元素位於前面的遞增陣列,則它應該大於等於第乙個指標指向的元素,此時我們要找到的最小元素肯定應該位於該中間元素的後面。這樣我們把第乙個指標指向中間元素,從而縮小查詢範圍。注意,移動之後的第乙個指標仍然是位於前面的遞增陣列中。
同理,如果中間元素位於後面的遞增子陣列,那麼它應該小於等於第二個指標指向的元素。此時最小元素應該位於中間元素的前面或者就是此中間元素。我們把第二個指標指向中間元素,從而縮小查詢範圍。注意,移動之後的第二個指標仍然是位於後面的遞增陣列中。
按照上述思路,第乙個指標總是指向前面的遞增陣列元素,而第二個指標總是指向後面的遞增陣列元素。最終第乙個指標將指向前面的子陣列的最後乙個元素,第二個指標將指向後面的子陣列的第乙個元素,即二者最後指向相鄰的元素,且第二個指標指向的剛好是最小的元素——迴圈結束條件。
注意:1)如果把排序陣列的前面的0個元素搬到最後面,即排序陣列本身,這仍是乙個旋轉陣列,此時,陣列中的第乙個數字就是最小數字,可以直接返回,所以把中間元素mid初始化為0。
2)如果第乙個指標指向的元素、第二個指標指向的元素和中間元素相同,則無法判斷中間元素是屬於哪個子陣列,也就無法移動兩個指標來縮小查詢範圍,此時還是要用順序查詢的方法。
class solution //if
int left = 0,right = size - 1;
int mid = 0;
// rotatearray[left] >= rotatearray[right] 確保旋轉
while(rotatearray[left] >= rotatearray[right])//if
mid = left + (right - left) / 2;
// rotatearray[left] rotatearray[right] rotatearray[mid]三者相等
// 無法確定中間元素是屬於前面還是後面的遞增子陣列
// 只能順序查詢
if(rotatearray[left] == rotatearray[right] && rotatearray[left] == rotatearray[mid])//if
// 中間元素位於前面的遞增子陣列
// 此時最小元素位於中間元素的後面
if(rotatearray[mid] >= rotatearray[left])//if
// 中間元素位於後面的遞增子陣列
// 此時最小元素位於中間元素的前面
else//else
}//while
return rotatearray[mid];
}private:
// 順序尋找最小值
int minorder(vector&num,int left,int right)//leftf
}//for
return result;}};
解題方法三:排序解法
利用vector的特性,更簡潔版本。
//快速解法
class solution
};
劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...
劍指offer 旋轉陣列的最小數字
記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...