1. 程式人生 > >二分查找來查找旋轉數組

二分查找來查找旋轉數組

大小 數組 while code == 大數 left 大於 solution

把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。

輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。

例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。

NOTE:給出的所有元素都大於0,若數組大小為0,請返回0。

二分查找代碼

class Solution
{ public:
    int minNumberInRotateArray(vector<int> rotateArray) 
    {
        int len = rotateArray.size(); 
        if(len == 0
) return 0; int left = 0, right = len -1, mid = 0; while(rotateArray[left] >= rotateArray[right]) { //左是大數組的最後一個,右是小數組的第一個,返回右的值 if(right - left == 1) { mid = right; break; } mid
= (left + right)/2; //如果左,右,中間的值相等,不知道中間在哪個數組中,需要用笨方法查找 if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]) { return shunxuOrder(rotateArray, left, right); } //如果中間的值小於右邊的值,那麽中間的值在小數組中,讓右等於中間的值
//如果中間的值等於右邊的值,此時中間的值一定小於左邊的值才能走到這裏,小於左邊的值說明它在小數組裏,讓右等於中間的值 if(rotateArray[mid] <= rotateArray[right]) { right = mid; } //如果中間的值大於右邊的值,那麽中間的值在大數組中,讓左等於中間的值 else { left = mid; } } return rotateArray[mid]; } private: int shunxuOrder(vector<int> &num, int left, int right) { int i; int result = num[left]; for(i = left + 1; i < right; ++ i) { if(num[i] < result) { result = num[i]; } } return result; } };

二分查找來查找旋轉數組