Leetcode-4. Median of Two Sorted Arrays

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数组过短时不会越界,若理解有误,欢迎指教。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值