题目:
原有一个有序数组(假设升序),分成前后两部分,然后将这两部分交换得到一个新的数组。写一个函数,参数是这个新的数组,要求找到数组分开的那个结点,而且要考虑时间复杂度。
解法1:
遍历该数组,找到第一个前一个大于后一个的数,否则返回最后一个数。时间复杂度O(n)。
解法2:
使用二分查找,时间复杂度O(lgn)。需要注意的是二分的地方不能使用mid+1,否则会错过那个结点。
#include <iostream>
using namespace std;
int find(int a[], int i, int j)
{
if(i<0 || j<0)
return -1;
if(i>=j)
return i;
int mid=(i+j)/2;
if(mid==i)//j=i+1
return i;
if(a[mid]>a[i])
return find(a,mid,j);//这里不能换成mid+1,否则会错过那个节点
else
return find(a,i,mid-1);
}
int main()
{
int a[11]={5,6,7,8,9,10,0,1,2,3,4};
//int a[11]={0,1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(int);
int index=find(a,0,len-1);
if (index!=-1)
cout<<"the "<<index<<"th number:"<<a[index]<<endl;
}
输出为:
the 5th number:10