解法一:顺序查找,复杂度 O(n)
#include <iostream>
#include <vector>
using namespace std;
vector<int> A;
int minNumberInRotateArray(vector<int> rotateArray,int n) {
if(n==0)
return 0;
int i=0;
while(i+1<n&&rotateArray[i]<rotateArray[i+1]){
i++;
}
return rotateArray[i+1];
}
int main(){
int n,k;
cin>>n;
for(int i=0;i<n;i++){
cin>>k;
A.push_back(k);
}
int result=minNumberInRotateArray(A,n);
cout<<result<<endl;
}
解法二:顺序查找 复杂度o(logn)
/*
int find2(int a[],int index1,int index2){
int result=a[index1];
for(int i=index1;i<=index2;i++){
if(a[i]<result){
result=a[i];
}
}
return result;
}
int find(int a[],int n){
if(a==NULL&&n<=0){
return 0;
}
int index1=0;
int index2=n-1;
int indexmid=index1;
while(a[index1]>=a[index2]){
indexmid=(index1+index2)/2;
//找到
if(index2-index1==1){
indexmid=index2;
break;
}
//如果index1,index2,indexmid所指的元素一样,则采用顺序查找;
if(a[index1]==a[index2]&&a[index2]==a[indexmid]){
return find2(a,index1,index2);
}
//否则二分查找
if(a[indexmid]>=a[index1])//在前面一个递增序列中
{
index1=indexmid;
}
if(a[indexmid]<=a[index2])//在后一个递增序列中
{
index2=indexmid;
}
}
return a[indexmid];
}
*/
find2元素存在的意义:
考虑到测试用例:
10111(a[0]=a[4]=a[indexmid])默认index1=indexmid,在后续递增数组中开始查找;其实最小元素为0,在前面数组中
11101(最小元素确实在后面一个递增数组中)