分析
最小值存在于三个区间,分别是mid位置,mid左边,mid右边。
- left的值如果比下标mid的值要小,最小值在mid及mid的右边,left = mid。
- left的值如果比下标mid的值要大,最小值在mid及mid的左边,right = mid。
边界条件
循环条件是 while(rotateArray[left] >= rotateArray[right])
,当下标left的值比下标right的值小的时候,此时数组有序,无需查找,直接返回下标mid对应的值即可。
注意
当rotateArray[left] == rotateArray[mid] && rotateArray[mid] == rotateArray[right]
时,此时无法判断三者大小,采取遍历的方法,找到最小值,并直接返回。
C++代码
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int left = 0, right = rotateArray.size()-1;
int mid = 0;
while(rotateArray[left] >= rotateArray[right])
{
if(right - left == 1)
{
mid = right;
break;
}
// 三数相等
if(rotateArray[left] == rotateArray[mid] && rotateArray[mid] == rotateArray[right])
{
int ret = rotateArray[left];
for(int i = left+1; i < right; ++i)
{
if(ret > rotateArray[i])
ret = rotateArray[i];
}
return ret;
}
mid = (left + right) >> 1;
if(rotateArray[mid] >= rotateArray[left])
{
left = mid;
}
else
{
right = mid;
}
}
return rotateArray[mid];
}
};