码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_Median of Two Sorted Arrays

时间:2015-08-06 22:18:25      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:median of two sorted   leetcode   

描述:

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)).

思路:

1.题意大概为查找两个数组 的中位数,这个不难,O(N)的时间复杂度就可以解决,但题目的要求是用 O(log (m+n))的时间复杂度来解决该问题!

2.由于时间复杂度为 O(log (m+n)),一般会用到二分法,每次取数组nums1和nums2所剩下的部分的中间值mid1和mid2,然后比较两个数组的中间值大小,较大的一个取数组较小的一部分,较小的mid数组取较大的一部分。由于每次都要多虑到一部分不符合条件的,所以刚开始要求第k=(len1+len2)/2个数的k每次都要更新。

3.重负步骤2,直至每个数组剩下的有效部分为0,则另一个数组的nums[start+k]即为中位数;另外一种可能是最后当k==0时,两个数组有效部分的开始的那个数肯定为要求的数。

哎,表述能力不行啊,自己都快被绕晕了(^-^)!

代码:

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if((nums1==null||nums1.length==0)&&(nums2==null||nums2.length==0))
            return 0;
        if(nums1==null||nums1.length==0)
            return getMidOfOneArray(nums2);
        if(nums2==null||nums2.length==0)
            return getMidOfOneArray(nums1);
		int totalLen = nums1.length + nums2.length;
		if ((totalLen & 0x1) == 1)
			return findMid(nums1, 0, nums1.length - 1, nums2, 0,
					nums2.length - 1, totalLen / 2);
		else
			return (findMid(nums1, 0, nums1.length - 1, nums2, 0,
					nums2.length - 1, totalLen / 2) + findMid(nums1, 0,
					nums1.length - 1, nums2, 0, nums2.length - 1,
					totalLen / 2 - 1)) * 0.5;
	}

	public double findMid(int nums1[], int start1, int end1, int nums2[],
			int start2, int end2, int k) {
		int aLen = end1 - start1 + 1;
		int bLen = end2 - start2 + 1;
		if (aLen == 0)
			return nums2[start2 + k];
		if (bLen == 0)
			return nums1[start1 + k];
		if (k == 0)
			return nums1[start1] < nums2[start2] ? nums1[start1]
					: nums2[start2];
		int aMid = aLen * k / (aLen + bLen);
		int bMid = k - aMid - 1;
		aMid = aMid + start1;
		bMid = bMid + start2;
		if (nums1[aMid] > nums2[bMid]) {
			k = k - (bMid - start2 + 1);
			end1 = aMid;
			start2 = bMid + 1;
		} else {
			k = k - (aMid - start1 + 1);
			end2 = bMid;
			start1 = aMid + 1;
		}
		return findMid(nums1, start1, end1, nums2, start2, end2, k);
	}
	public double getMidOfOneArray(int arr[])
	{
	    if((arr.length&0x1)==0)
	        return (arr[arr.length/2]+arr[arr.length/2-1])*0.5;
	    return arr[arr.length/2];
	}


版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode_Median of Two Sorted Arrays

标签:median of two sorted   leetcode   

原文地址:http://blog.csdn.net/mnmlist/article/details/47323437

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!