思路: 二分查找的变形, 注意开头和结尾是相同数字时的特殊情况。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size() == 0)
return 0;
int left = 0, right = rotateArray.size()-1;
int mid = left;
// 确保旋转
while(rotateArray[left] >= rotateArray[right])
{
if(right - left == 1)
{
mid = right;
break;
}
mid = left + (right - left) / 2;
// 特殊情况, 进行顺序查找
if(rotateArray[left] == rotateArray[right] && rotateArray[mid] == rotateArray[left])
return orderSeach(rotateArray, left, right);
if(rotateArray[mid] >= rotateArray[left])
left = mid;
if(rotateArray[mid] <= rotateArray[right])
right = mid;
}
return rotateArray[mid];
}
private:
int orderSeach(vector<int>& arr,int left,int right)
{
int min = arr[left];
for(int i = left+1; i <= right ; i++)
if(min > arr[i])
min = arr[i];
return min;
}
};