【问题描述】
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问题来源:Median of Two Sorted Arrays
【问题分析】
题意很简单,求两个有序数组组合起来后的中位数。
用最简单直接的方法,两个for循环遍历两个数组进行排序,找出排序后数组的中位数,这种时间复杂度为O(m*n)。
这里没有采用分治方法,而是采用了简单的归并排序。假设有两个数组A1和A2,比较两个数组的元素A1[i]和A2[j],将较小的元素放入新数组,如果A1[i]小,则i++;如果A2[j]小,则j++,再接着比较A1[i]和A2[j],直到一个数组全部进行了比较。时间复杂度为O(m+n)。
给出了两份代码,第一份是全部排完序后寻找它的中位数,第二份是排序到它的中位数后直接停止排序。
【源代码】
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int count = nums1.size() + nums2.size();
int i = 0;
int j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
result.push_back(nums1[i]);
i++;
} else {
result.push_back(nums2[j]);
j++;
}
}
while(i < nums1.size()) {
result.push_back(nums1[i]);
i++;
}
while(j < nums2.size()) {
result.push_back(nums2[j]);
j++;
}
if (count == 0) {
return 0;
} else if (count % 2 == 0) {
return (result[count/2] + result[count/2 - 1]) / 2.0;
} else {
return (result[count/2]);
}
}
};
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
stack<int> result;
int count = nums1.size() + nums2.size();
int i= 0;
int j = 0;
while (i < nums1.size() || j < nums2.size()) {
if (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
result.push(nums1[i]);
i++;
} else {
result.push(nums2[j]);
j++;
}
} else {
if (j >= nums2.size()) {
result.push(nums1[i]);
i++;
} else {
result.push(nums2[j]);
j++;
}
}
if (result.size() > count / 2) {
if (count % 2 == 0) {
int number1 = result.top();
result.pop();
return (number1 + result.top())/2.0;
} else {
return result.top();
}
}
}
return 0;
}
};