题目描述(来源于 剑指offer)
注意:旋转数组的定义是将头部整体搬移到尾部!!!而不是翻转!!!
思路:1暴力循环遍历,从头找,碰到的第一个变小的数字即为最小的数字,否则返回头部(所有数字都相等或者头部为最小数字的情况。)
2.二分查找。
具体代码:
//第一种方法,直接从头遍历
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray);
};
int Solution::minNumberInRotateArray(vector<int> rotateArray)
{
if (rotateArray.size() == 0)
return 0;
if (rotateArray.size() == 1)
return rotateArray[0];
for(auto it=rotateArray.begin();it!=rotateArray.end()-1;it++)
{
if(*it>*(it+1))
return *(it+1);
}
return rotateArray[0];
}
//第二种方法,二分法
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray);
};
int Solution::minNumberInRotateArray(vector<int> rotateArray)
{
if (rotateArray.size() == 0)
return 0;
if (rotateArray.size() == 1)
return rotateArray[0];
int la = 0;
int ra = rotateArray.size() - 1;
int mid = (la + ra) / 2;
while (la<ra)
{
if (rotateArray[mid] < rotateArray[ra])
{
ra = mid;
mid = (la + ra) / 2;
}
else if (rotateArray[mid]>rotateArray[ra])
{
la = mid+1;
mid = (la + ra) / 2;
}
else
{
ra = ra - 1;
mid = (la + ra) / 2;
}
}
return rotateArray[mid];
}