二分查找來查找旋轉數組
阿新 • • 發佈:2018-06-05
大小 數組 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;
}
};
二分查找來查找旋轉數組