Problem Description
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
Mentality
最简单的办法,就是遍历整个数组,找出最小值。
改进一下算法,由于原数组是非递减的,也就是递增的,经过旋转之后,就形成了两个递增序列,最小值就在两个递增序列中间处,只要找出不递增的位置,就找到了最小值。若找不到该位置,说明是把原数组整个旋转了,即开头就是最小值。
Code (C++)
方法一(使用函数和迭代器)
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty())//若数组为空即大小为0
return 0;//返回0
int re=*(rotateArray.begin());
for(auto it=rotateArray.begin(); it!=rotateArray.end(); it++)
if(*it<re)
re = *it;
return re;
}
};
方法一(不使用迭代器)
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len=rotateArray.size();
if(len==0)//若数组为空即大小为0
return 0;//返回0
int re=rotateArray[0];
for(int i=1;i<len;i++)
if(rotateArray[i]<re)
re = rotateArray[i];
return re;
}
};
方法二:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len=rotateArray.size();
if(len==0)//若数组为空即大小为0
return 0;//返回0
for(int i=0; i<len-1; i++)
if(rotateArray[i]>rotateArray[i+1])
return rotateArray[i+1];
return rotateArray[0];
}
};
本地测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main(){
Solution s;
vector<int> test1={3,4,5,1,2};
vector<int> test2={1,2,3,4,5};
cout<<s.minNumberInRotateArray(test1)<<endl;
cout<<s.minNumberInRotateArray(test2);
return 0;
}
运行结果如图:
已通过所有的测试用例,欢迎指正批评(´▽`ʃ♡ƪ)