寻找数字在旋转数组中的位置
2015-10-08 20:06
218 查看
这是做小米的笔试题时遇到的一个题目:给定一个数组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[
4000
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;
}
因为数组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[
4000
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;
}
相关文章推荐
- ios中block中的探究
- ThinkPHP 7.使用redis扩展
- UVA808 - Bee Breeding
- 插入排序之希尔排序
- auto_ptr浅析 http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html
- poj 2018 斜率优化(最大平均值问题)
- 区间集的覆盖长度
- 2015国庆总结
- [数据挖掘课程笔记]SLIQ算法
- 判断一棵二叉树是否平衡二叉树
- C++复习:位运算
- 高并发网站架构设计方案
- 【leetcode】79. Word Search
- Dialog中有EditText无法弹出输入法解决方法
- 数据结构实验之栈六:下一较大值(二)【OJ-3333】【自己写的封装的栈代码】
- 自居电路(升压电路)
- 关于AlertDialog的常见用法
- 海量数据处理分析
- 编辑并保存手机中的图片至本地
- Linux CP文件夹略过目录的解决