寻找数字在旋转数组中的位置

来源:互联网 发布:java编程学校 编辑:程序博客网 时间:2024/05/01 23:15

        这是做小米的笔试题时遇到的一个题目:给定一个数组A和一个整数n,已知这个数组是有一个已排序、递增的数组旋转以为而成。但现在不知道这个数组被移动了多少位。写一个函数,找出n在A中的位置。

因为数组a是可以分成两个有序的数组,因此可以利用二分查找法来查找n的位置。


 #include <iostream>

#include <ctime>

using namespace std;

int search(int *a, int count, int n)
{
if(!a || count < 1)
return -1;
int start = 0;
int end = count - 1;
while(start <= end)
{
int mid = (start + end) / 2;
if(a[mid] == n)  //找到该数字,返回其下标
return mid;
else if(a[start] == a[mid] && a[mid] == a[end]) 
{//无法判断a[mid]是在前一个数组还是后一个数组中,需要遍历整个数组
for(int pos = 0; pos < count; ++pos)
{
if(a[pos] == n)
return pos;
}

return -1;
}
else if(a[mid] >= a[start]) //中间的数字位于前面的数组中 
{
if(a[mid] > n) //中间数字比n大,需要判断是到前半段中找还是后半段中找
{
if(n >= a[start])  //n比第一个元素大,说明n介于a[start]和a[mid]之间,应到前半段中找
end = mid - 1;
else
start = mid + 1;
}
else  //中间数字比n小,而只有mid之后的元素才有可能比a[mid]大,因此到后半段中找
start = mid + 1;
}
else  //中间的数字位于后面的数组中
{
if(a[mid] < n)   //a[mid]小于n
{
if(n <= a[end])  //说明n介于a[mid]和a[end]之间,要到后半段中找
start = mid + 1;
else
end = mid - 1;
}
else  //a[mid]大于n,而mid之前的元素才有可能比a[mid]小
end = mid - 1;
}
}
return -1;
}


int main()
{
/*int a1[] = {5,6,7,1,2,3,4};
int a2[] = {3,4,5,6,7,1,2};

int a3[] = {1,2,3,4,5,6,7};
int a4[] = {7,1,2,3,4,5,6};
srand(time(0));
int k = rand()%7 + 1;
int result1 = search(a1,7,k);
int result2 = search(a2,7,k);
int result3 = search(a3,7,k);
int result4 = search(a4,7,k);
cout<<k<<endl;
cout<<result1<<endl;
cout<<result2<<endl;
cout<<result3<<endl;
cout<<result4<<endl;*/
int arr[] = {1,1,1,0,1};
int res = search(arr,5,0);
cout<<res<<endl;
return 0;
}



0 0
原创粉丝点击