题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
/* 得到数组的长度 */
int arrar_size = rotateArray.size();
int start = 0, end = arrar_size-1;
int middle = 0;
/* 检验传入的数组是否正确 */
if(arrar_size == 0)
{
return 0;
}
while(1)
{
/* 这两种情况都将退出 */
if((end == start) || (end - start == 1))
{
middle = end;
break;
}
/* 如果是 12345数组 */
if(rotateArray[end] > rotateArray[start])
{
return rotateArray[start];
}
/* 得到中点的坐标 */
middle = (start + end)/2;
/* 避免 10111 或11101这样的数组,如果是这样的数组还需要遍历整个数组 */
if(rotateArray[middle] == rotateArray[start] &&
rotateArray[middle] == rotateArray[end])
{
return getMinData(rotateArray);
}
if(rotateArray[middle] >= rotateArray[start])
{
start = middle;
}
else if(rotateArray[end] >= rotateArray[middle])
{
end = middle;
}
}
return rotateArray[middle];
}
int getMinData(vector<int> rotateArray)
{
int min = rotateArray[0];
int index = 0;
for(index = 1; index < rotateArray.size(); index++)
{
if(rotateArray[index] < min)
{
min = rotateArray[index];
}
}
return min;
}
};
int main()
{
vector<int> vec(5);
vec[0] = 1;
vec[1] = 0;
vec[2] = 0;
vec[3] = 0;
vec[4] = 0;
Solution s;
cout << s.minNumberInRotateArray(vec) << endl;
return 0;
}