您的位置:首页 > 其它

leetcode_median of two sorted arrays

2017-07-06 09:15 323 查看
题目:

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

Example 1:

nums1 = [1, 3]

nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]

nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

我的答案:

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
if (m == 0)
{
if (n == 0)
return 0.0;
else
return n % 2 == 0 ? double(nums2[n / 2] + nums2[n / 2 - 1]) / 2.0 : double(nums2[n / 2]);
}
else
{
if (n == 0)
return m % 2 == 0 ? double(nums1[m / 2] + nums1[m / 2 - 1]) / 2.0 : double(nums1[m / 2]);
}
int N = m + n;
int flag;
if (N % 2 == 0)
flag = 0;
else
flag = 1;
int mid = N / 2;
int a1, a2 = 0;
int i = 0, j = 0, count = 0;
if (nums1[0] <= nums2[0])
{
a1 = nums1[0];
i++;
}
else
{
a1 = nums2[0];
j++;
}
while ((i<m) && (j<n))
{
if (count == mid)
{
if (flag == 0)
return double(a1 + a2) / 2.0;
else
return double(a1);
}
a2 = a1;
if (nums1[i] <= nums2[j])
{
a1 = nums1[i];
i++;
}
else
{
a1 = nums2[j];
j++;
}
count++;
}
while (i < m)
{
if (count == mid)
{
if (flag == 0)
return double(a1 + a2) / 2.0;
else
return double(a1);
}
a2 = a1;
a1 = nums1[i];
i++;
count++;
}
while (j < n)
{
if (count == mid)
{
if (flag == 0)
return double(a1 + a2) / 2.0;
else
return double(a1);
}
a2 = a1;
a1 = nums2[j];
j++;
count++;
}
if (flag == 0)
return double(a1 + a2) / 2.0;
else
return double(a1);
}
思路解析:

      首先先不考虑一些比较特殊的情况,考虑两个已排序的数组长度都是大于0的,这个题目的目标就是要找到两个已经排序的数组在放在一块排序之后最中间的一个或者两个数的平均值(如果总长度是奇数,就是中间的那个值,如果总长度是偶数,就是中间两个值的平均值),我们不需要对两个数组重新排序,只需要不断比较这两个数组中的值进行排序,并记录比较的次数,拿两个变量a1,a2记录本次与上次比较的结果,当比较次数达到总长度的一半的时候,那两个变量拿两个变量a1,a2记录的值就是我们找到的总序列的中间值,再判读整个序列长度是奇数或者偶数,以此来计算中间值median。这里的特殊情况就是两个数组中有一个是空数组或者两个都是空数组等情况,只要单独处理即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: