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

LeetCode 4_Median of Two Sorted Arrays

时间:2015-07-28 10:54:56      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:leetcode   median of two sorted   c++   

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

题目的关键是时间复杂度的要求,不然直接将两个数组凑起来就行,不过为O(m + n);

由于两个数组都已排好序,可以分别取两个数组的中位数进行比较假设分别为A,B,若A < B,显然第一个数组中小与

A的肯定小与整体的中位数(设为C),反之亦然,当然若A == B,A就是C了。到这里,转换一下思维,何为中位数?

不就是整个数据中处于中间位置的那个数吗(先不分奇偶,意思懂就行),那么中位数也就是正好有一半数据比其小的

那个数,这好像是一个比较经典的问题,即求第K小的数据!想到了这个地方,题目的解法也就出来了,代码如下:

int FindMedium(vector<int>::iterator iter1, int m, vector<int>::iterator iter2, int n, int k)
{
	if(m > n)
		return FindMedium(iter2, n, iter1, m, k);
	if(m == 0)
		return (*(iter2 + k - 1));
	if(k == 1)
		return min(*iter1, *iter2);
	int tmp1 = min(k / 2, m);
	int tmp2 = k - tmp1;
	if(*(iter1 + tmp1 - 1) < *(iter2 + tmp2 - 1))
		return FindMedium(iter1 + tmp1, m - tmp1, iter2, n, tmp2);
	else if (*(iter1 + tmp1 - 1) > *(iter2 + tmp2 - 1))
		return FindMedium(iter1, m, iter2 + tmp2, n - tmp2, tmp1);
	else
		return *(iter1 + tmp1 - 1);
}
class Solution {
public:
	double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
	{
		int total = nums1.size() + nums2.size();
		vector<int>::iterator iter1 = nums1.begin();
		vector<int>::iterator iter2 = nums2.begin();
		if(total & 0x01)
			return FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2 + 1);
		else
			return ( FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2) 
			+ FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2 + 1) ) * 1.0 / 2;
	}
};

格式调了半天,也没对好,不晓得又出什么问题了,吐槽下CSDN。。。

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

LeetCode 4_Median of Two Sorted Arrays

标签:leetcode   median of two sorted   c++   

原文地址:http://blog.csdn.net/xwchao2014/article/details/47099759

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