您的位置:首页 > 编程语言 > C语言/C++

Leetcode-4. Median of Two Sorted Arrays

2016-06-19 22:27 411 查看
There are two sorted arrays nums1 and nums2 of
size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

一、很好想到,类似一趟Merge Sort,时间复杂度为o(m/2+n/2),还是o(m+n),不过在leetcode系统还是能够通过。

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> s;
int n,m,len=0,i,j;
n=nums1.size();
m=nums2.size();
i=j=0;
while(len<=(m+n)/2){
if(i<n && j<m){
if(nums1[i]<nums2[j]){
s.push_back(nums1[i++]);
len++;
}
else{
s.push_back(nums2[j++]);
len++;
}
}
else if(i==n && j<m){
s.push_back(nums2[j++]);
len++;
}
else if(i<n && j==m){
s.push_back(nums1[i++]);
len++;
}
}
if((m+n)&1){ //even
i=s[len-1];
return i;
}
else{
i=s[len-1];
j=s[len-2];
return (double)(i+j)/2;
}
}

二、参考http://blog.csdn.net/zxzxy1988/article/details/8587244

        题目要去log(m+n)的时间复杂度,题意转化为求第k=(m+n-1)/2大的数(奇偶有关),暂时只考虑m+n为奇数的情况下:

如果:

nums1[k/2-1] = nums2[k/2-1];
返回其中一个就是中位数

nums1[k/2-1] < nums2[k/2-1];    表明中位数不可能在nums1的前k/2-1个数里面,此时只需要在nums1剩下的数组和nums2中找

nums1[k/2-1] > nums2[k/2-1];    表明中位数不肯能在nums2的前k/2-1个数里面,此时只需要在nums2剩下的数组和nums1中找

处理几种边界情况,即可。

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int ma=nums1.size(),mb=nums2.size();
int len=ma+mb;
if(len&1){
return findKth(nums1,nums2,len/2+1);
}
else{
return (findKth(nums1,nums2,len/2)+findKth(nums1,nums2,len/2+1))/2;
}
}
double findKth(vector<int>& v1,vector<int>& v2,int k){
int ma=v1.size(),mb=v2.size();
if(ma>mb){
return findKth(v2,v1,k);
}
if(ma==0){
return v2[k-1];
}
if(1==k){
return min(v1[0],v2[0]);
}
int pa=min(k/2,ma),pb=k-pa;
if(v1[pa-1] < v2[pb-1]){
vector<int>:: iterator it1=v1.begin()+pa,it2=v1.end();
vector<int> v3(it1,it2);
return findKth(v3,v2,k-pa);
}
else if(v1[pa-1] > v2[pb-1]){
vector<int>:: iterator it1=v2.begin()+pb,it2=v2.end();
vector<int> v3(it1,it2);
return findKth(v1,v3,k-pb);
}
else{
return v1[pa-1];
}
}
特别注意几个边界输入:[1],[2,3]        [3,4,5],[1,2]     [],[1]
int
pa=min(k/2,ma),pb=k-pa; 我的理解是保证nums1数组过短时不会越界,若理解有误,欢迎指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息