两个有序数组,判断一个给定的数p在合并后的位置
2015-09-07 17:32
495 查看
有两个有序数组,给定的一个数p(p是两个数组中的任意一个数,也可能同时存在于两个数组之中),判断这个数p在两个数组合并后的大数组的位置。
要求:空间复杂度为O(1),即不能真正合并两个数组
以下代码实现,其时间复杂度为O(log(m)+log(n)):
若有改进之处,望高手指正。
要求:空间复杂度为O(1),即不能真正合并两个数组
以下代码实现,其时间复杂度为O(log(m)+log(n)):
#include <iostream> #include<vector> using namespace std; int getkth(vector<int> arrays,int left,int p){ int i =0; for( i =left;i<arrays.size();i++){ if(arrays[i]>=p) { i--; break; } } return i; } int find(vector<int> a,int aleft,int aright,vector<int> b,int bleft,int bright ,int p){ int amid= (aleft+aright)/2; int bmid= (bleft+bright)/2; if(aleft>=aright){ return aleft+getkth(b,bleft,p)+2; } if(bleft>=bright){ return bleft+getkth(a,aleft,p)+2; } if(a[amid]<=b[bmid]){ if(p>b[bmid]) return find(a,amid+1,aright,b,bmid+1,bright,p); if(p<=b[bmid]&&p>a[amid]) return find(a,amid+1,aright,b,bleft,bmid,p); if(p<=a[amid]) return find(a,aleft,amid,b,bleft,bmid,p); }else{ if(p>a[amid]) return find(a,amid+1,aright,b,bmid+1,bright,p); if(p<=a[amid]&&p>b[bmid]) return find(a,aleft,amid,b,bmid+1,bright,p); if(p<=b[bmid]) return find(a,aleft,amid,b,bleft,bmid,p); } } int main () { int num = 7; int p=5; int a[]={1,2,5,5,5,5,6}; int b[]={2,3,5,7,9,10,11}; vector<int> ai; vector<int> bi; for(int i=0;i<num;i++){ ai.push_back(a[i]); bi.push_back(b[i]); } int pos = find(ai,0,ai.size()-1,bi,0,bi.size()-1,p); cout<<pos<<endl; }
若有改进之处,望高手指正。
相关文章推荐
- vs2010
- 关于Windows Mobile连接不上电脑的问题的解决方法
- 将表数据转换成字符串
- 在Maven父项目下创建子项目
- Qt调用VS生成的dll
- Mapping a bidirectional list with Hibernate
- n个筛子的点数
- Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢
- 周一C/C++语音中函数参数传递的三种方式
- 悼念512汶川大地震遇难同胞——选拔志愿者 2188 (数学博弈)
- Android知识点7-Android控件自定义样式
- python_正则表达式
- hibernate 配置@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 主导方问题删除问题。
- Android三种实现定时器的方法
- Android WebView控件的显示,调用网页,然后隐藏
- ios工程依赖
- Bitmap实现照片墙
- Mac中Myeclipse 10安装破解,以及安装出现的问题解决
- 每天一道算法题(35)——删除字符串首尾的空格
- 每天一道算法题(35)——删除字符串首尾的空格