题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解法一:从头到尾将数组遍历一次,找到最小的元素。时间复杂度O(n)
解法二:二分查找。最小的元素是前后两个有序子数组的分界线。注:需要考虑特殊情况,即数组两边都一样大。
代码如下:
#include<iostream>
using namespace std;
int binarySearch(int a[], int start, int end)
{
if(start+1==end || start==end)
{
int smaller = a[end] < a[start] ? a[end] : a[start];
return smaller;
}
int mid=(start+end)/2;
if(a[start]==a[end] && a[mid]==a[end]) //特殊情况:两边都一样大,两边均遍历
{
int find1=binarySearch(a,start,mid);
int find2=binarySearch(a,mid+1,end);
return find1 < find2 ? find1 : find2;
}
else if(a[mid]>=a[start] && a[mid]>a[end])
binarySearch(a,mid,end);
else
binarySearch(a,start,mid);
}
int main()
{
int N,min=1000001;
int a[10000];
cin>>N;
for(int i=0;i<N;i++)
cin>>a[i];
cout<<binarySearch(a,0,N-1)<<endl;
return 0;
}