特殊情況示例如下:
如果出現這種情況,此時我們需要選擇順序排序:
if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid])
{
return Minorder(rotateArray,left,right);
}
int Minorder(vector<int> &rotateArray, int left, int right)
{
int minVal = rotateArray[left];
for(int i = left; i <= right; i++)
{
minVal = min(minVal,rotateArray[i]);
}
return minVal;
}
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
/*
直接採用的排序 時間複雜度爲o(n)
sort(rotateArray.begin(),rotateArray.end());
return rotateArray[0];
*/
//模仿二分查找的算法,時間複雜度o(logn)
if(rotateArray.empty())
{
return 0;
}
int left = 0;
int right = rotateArray.size() - 1;
int mid = 0; //針對的是把0個元素旋轉到後面,那麼第一個元素就是最小的數字
//確保是一個旋轉數組,首元素大於最後一個元素
while(rotateArray[left] >= rotateArray[right])
{
if(right - left == 1)
{
mid = right;
break;
}
mid = left + (right-left)/2;
if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid])
{
return Minorder(rotateArray,left,right);
}
if(rotateArray[left] <= rotateArray[mid])
{
left = mid;
}
else if(rotateArray[right] >= rotateArray[mid])
{
right = mid;
}
}
return rotateArray[mid];
}
int Minorder(vector<int> &rotateArray, int left, int right)
{
int minVal = rotateArray[left];
for(int i = left; i <= right; i++)
{
minVal = min(minVal,rotateArray[i]);
}
return minVal;
}
};