题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
样例
输入:
3,4,5,1,2
输出:
1
// 尽量用二分查找
class Solution {
public:
int findMin(vector[HTML_REMOVED] rotateArray) {
if (rotateArray.size() == 0) return -1;
int first = 0, last = rotateArray.size() - 1;
while (first < last)
{
// 第一种情况,整体单调递增,那么第一个就是最小的,比如12345
if (rotateArray[first] < rotateArray[last])
{
return rotateArray[first];
}
int mid = first + ((last - first) / 2);
// 第2种情况,前面一段是单调递增,那么最小值就只能在mid(不包括mid)位置之后,比如34512
if (rotateArray[mid] > rotateArray[last])
{
first = mid + 1;
}
// 第3种情况,mid到last单调递增,那么最小值在mid(包括mid)位置之前,比如54123
else if (rotateArray[mid] < rotateArray[last])
{
last = mid;
}
// 其他情况,慢慢缩小范围
else
{
++ first;
}
}
return rotateArray[first];
}
};