题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
完整代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
//统计容器的元素个数
int length = rotateArray.size();
//检查输入的合法性
if(length==0)
return 0;
//定义游标1并初始化
int index1=0;
//定义游标2并初始化
int index2=length-1;
//定义IndexMid为只想数组的最小元素并初始化为指向数组的第一个元素,理由是:如果0个元素旋转到数组末尾,即数组本身该数组还是旋转数组,
//此时数组第一个元素小于最后一个元素,则第一个元素必为最小值
int indexMid = index1;
//按照旋转数组的规则,第一个元素大于或等于最后一个元素
while(rotateArray[index1]>=rotateArray[index2])
{
//如果两个游标指向相邻的元素
if(index2-index1==1)
{
//第二个游标所指即为数组的最小元素
indexMid=index2;
break;
}
//如果不是上面的情况,则寻找中间元素
indexMid=(index1+index2)/2;
//当游标1和游标2、最小元素游标指向相同元素
//采用顺序查找
if(rotateArray[index1]==rotateArray[index2]&& rotateArray[indexMid]==rotateArray[index2])
{
//从起始游标处开始
int result = rotateArray[index1];
//遍历整个数组
for(int i=index1+1;i<length-1;++i)
{
//如果发现有最小的数值
if(result>rotateArray[i])
result=rotateArray[i];//赋值给result
}
//返回最小值
return result;
}
//正常情况下
//当中间元素不小于游标1所指元素,说明分界点在后面
if(rotateArray[indexMid]>=rotateArray[index1])
index1=indexMid; //将游标1移到中间元素的位置
//当中间元素不大于游标2所指元素,说明分界点在前面
else if(rotateArray[indexMid]<=rotateArray[index2])
index2=indexMid;//将游标2移到中间元素的位置
}
//返回数组中最小的元素
return rotateArray[indexMid];
}
};