题目链接:请点击
思路:首先要理解题目的意思,“输入一个非递减数组的旋转”,也就是说有一个非递减的数组,然后对其中的某些元素进行旋转,且这个“旋转”实际上就是把非递减数组的后面某些元素放到前面,且不改变这些元素的顺序,然后让找原数组找那个最小的数字,实际上就是原数组中第一个元素(因为原数组是非递减的)。
那么,把数组进行首尾拼接(也就是用两个相同的数组首尾相接),原数组恰好就在其中。比如,题目给的3,4,5,1,2,用两个相同的首尾相接,有3,4,5,1,2,3,4,5 ,1,2。这样,直接找此序列中,第一个右边数字小于左边数字的即可。
代码
#include<iostream>
#include<vector>
using namespace std;
int minNumberInRotateArray(vector<int> rotateArray) {
int size=rotateArray.size();
vector<int> array(2*size);
for(int i=0;i<size;i++){
array[i]=rotateArray[i];
array[i+size]=rotateArray[i];
}
int bz=0;
for(int i=0;i<array.size();i++){
if(array[i]<=0) bz=1;//有小于0的元素
if(array[i+1]<array[i]){
return array[i+1];
}
}
if(!bz&&rotateArray.size()) return 0;
}
int main(){
vector<int> v;
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(1);
v.push_back(2);
int min=minNumberInRotateArray(v);
cout<<min<<endl;
return 0;
}