寻找数字在旋转数组中的位置
来源:互联网 发布: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;
}
- 寻找数字在旋转数组中的位置
- 寻找旋转数组中的最小值
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- ~旋转数组中的最小数字~
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- 旋转数组中的最小数字
- LintCode-寻找旋转排序数组中的最小值
- 题目:寻找旋转排序数组中的最小值
- 寻找旋转排序数组中的最小值
- LintCode 寻找旋转排序数组中的最小值
- 黑马程序员—Foundation框架之NSArray与NSMutableArray
- 什么是Kivy???
- 海量数据处理分析
- UVA808 - Bee Breeding
- ThinkPHP 7.使用redis扩展
- 寻找数字在旋转数组中的位置
- 区间集的覆盖长度
- 2015国庆总结
- auto_ptr浅析 http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html
- java异常处理
- ZOJ 2319 Beautiful People (LIS的变形)
- New
- 第一阶段的结束
- 快速幂取模算法