多数组第K小数
2016-05-06 13:09
218 查看
给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数。
例如:
arr1 = {1,2,3,4,5};
arr2 = {3,4,5};
K = 1;
因为1为所有数中最小的,所以返回1;
arr1 = {1,2,3};
arr2 = {3,4,5,6};
K = 4;
因为3为所有数中第4小的数,所以返回3;
要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。
直接上代码:
例如:
arr1 = {1,2,3,4,5};
arr2 = {3,4,5};
K = 1;
因为1为所有数中最小的,所以返回1;
arr1 = {1,2,3};
arr2 = {3,4,5,6};
K = 4;
因为3为所有数中第4小的数,所以返回3;
要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。
直接上代码:
class Solution { public: int getupmedian(vector<int> arr1,int start1,int end1, vector<int> arr2,int start2,int end2){ int mid1=(start1+end1)/2; int mid2=(start2+end2)/2; int offest=((end1-start1+1)&1)^1; if(end1<start1) return -1; if(start1==end1) return arr1[start1]<=arr2[start2]?arr1[start1]:arr2[start2]; if(arr1[mid1]==arr2[mid2]) return arr1[mid1]; else if(arr1[mid1]>arr2[mid2]) return getupmedian(arr1,start1,mid1,arr2,mid2+offest,end2); else return getupmedian(arr1,mid1+offest,end1,arr2,start2,mid2); } int findKthNum(vector<int> arr1, vector<int> arr2, int kth) { int len1=arr1.size(),len2=arr2.size(); if(kth<1 || kth>len1+len2) return -1; if(len1<len2) arr1.swap(arr2); len1=arr1.size(); len2=arr2.size(); if(kth<=len2) return getupmedian( arr2,0,kth-1,arr1,0,kth-1); if(kth>len1){ if(arr2[kth-len1-1]>=arr1[len1-1]) return arr2[kth-len1-1]; if(arr1[kth-len2-1]>=arr2[len2-1]) return arr1[kth-len2-1]; return getupmedian(arr2,kth-len1,len2-1,arr1,kth-len2,len1-1); } if(arr1[kth-len2-1]>=arr2[len2-1]) return arr1[kth-len2-1]; return getupmedian( arr2,0,len2-1,arr1,kth-len2,kth-1); } };
相关文章推荐
- Android异常捕获03
- ORACLE 操作
- 常见快捷键eclipse
- 圆形图片的处理
- lvs-nat实验
- PAT-B 1033. 旧键盘打字
- hdoj2044注意要用long long否则会溢出
- tomcat服务器环境搭建
- spring 学习
- 三种JDBC批量插入编程方法的比较
- ANTLR v4学习笔记
- 【hihocoder 1258 Osu! Master】
- Yii2 数据操作Query Builder
- 【LeetCode 214】最长回文子串
- 【HUSTOJ】1073: 拐角VI
- iOS开发系列--打造自己的“美图秀秀”
- 关于c#数据库的简单应用-datagriview连接数据库及更相关操作
- Fresco简单的使用—SimpleDraweeView
- Android IOC 框架ViewInject(上)
- 毛玻璃效果