微软等数据结构+算法面试100题(39)-- 左旋数组中查找
2012-11-11 20:41
423 查看
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
//递减数组左旋可以分为俩种情况。|| 表示分界处 /* 第一种:6,5,4,3,2,1,|| 9,8,7 第二种:3,2,1,|| 9,8,7,6,5,4 数组[low....high]。mid=low+(high-low)/2; 如果是p[mid]<=p[low]。那么就是第一种。[low,mid]是有序的。[mid,high]不是有序的。 如果是p[mid]>p[low]。那么就是第而种。[low,mid]是无序的。[mid,high]是有序的。 每一种情况再分要找的元素n和p[mid]的关系。看n是在前半段还是后半段。这样类似于二分查找的思想。 */ int RotateLeftFindRecursion(int *p,int low,int high,int n) { if(low>high) return -1; if(low==high) return p[low]==n?low:-1; int mid=low+(high-low)/2; if(p[mid]<=p[low]) { if(n>=p[mid]&&n<=p[low]) return RotateLeftFindRecursion(p, low,mid,n); else return RotateLeftFindRecursion(p, mid+1,high,n); } else { if(n<=p[mid]&&n>=p[high]) return RotateLeftFindRecursion(p, mid,high,n); else return RotateLeftFindRecursion(p, low,mid-1,n); } } void RotateLeftFindTest() { int p[]={4,3,2,1,10,9,8,7,6,5}; int len=sizeof(p)/sizeof(int); cout<<"array : "; ShowArray(p,len); int n=0; while(1) { cout<<"n : "; cin>>n; int index=RotateLeftFind(p,0,len-1,n); int index1=RotateLeftFindRecursion(p,0,len-1,n); cout<<"index : "<<index<<endl; cout<<"p[index] : "<<p[index]<<endl; cout<<"index1 : "<<index1<<endl; cout<<"p[index1] : "<<p[index1]<<endl; } }
相关文章推荐
- 微软等数据结构+算法面试100题(9)--在一个int 数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- 微软等数据结构+算法面试100题(5)--怎样编写一个程序,把一个有序整数数组放到二叉树中
- 微软等数据结构+算法面试100题(40)-- 旋转数组中的最小元素
- 微软等数据结构+算法面试100题(16)--查找子串
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和
- 微软等数据结构+算法面试100题(23)--数组中超过出现次数超过一半的数字
- 微软等数据结构+算法面试100题(46)-- 查找最小的k 个元素
- 微软等数据结构+算法面试100题005
- [答案V0.2版]精选微软等数据结构+算法面试100题[1-20]
- 微软等数据结构+算法面试100题(26)--数值的整数次方
- 微软等数据结构+算法面试100题(33)--用俩个栈实现队列
- 微软等数据结构+算法面试100题全部答案集锦
- (转)微软等数据结构+算法面试100题全部答案集锦
- 微软等数据结构+算法面试100题(8)--华为面试题
- 微软等数据结构+算法面试100题(27)--颠倒栈
- 微软等数据结构+算法面试100题(34)-- 类CMyString
- [置顶]横空出世,席卷互联网--评微软等公司数据结构和算法面试100题
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题
- 微软等公司算法+数据结构面试100题