题目描述:
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)).
Tags: Divide and Conquer Array Binary Search
分析:
首先,中位数的定义是位于中间位置的元素,如果是偶数个元素,那么中位数就是中间两个元素的平均值。
看到时间复杂度要求,用归并就可以了。先归并排序,然后直接定位中间的元素,或中间两个元素,求出平均值即可。
当然,归并之前得判断是否两个数组都非空,若其中一个为空就不用归并了。
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)).
Tags: Divide and Conquer Array Binary Search
分析:
首先,中位数的定义是位于中间位置的元素,如果是偶数个元素,那么中位数就是中间两个元素的平均值。
看到时间复杂度要求,用归并就可以了。先归并排序,然后直接定位中间的元素,或中间两个元素,求出平均值即可。
当然,归并之前得判断是否两个数组都非空,若其中一个为空就不用归并了。
以下是实现代码:
/**44ms//*/
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
double mid = 0.0;
int m = nums1.size();
int n = nums2.size();
int len = m + n;
if(len == 0)
return mid;
if(n == 0 && m > 0){ //nums2为空,直接在nums1中找中位数
if(m == 1)
mid = (double)nums1[0];
else if(m %2 == 0)
mid = (nums1[m/2] + nums1[m/2 -1])/2.0;
else
mid = (double)nums1[m/2];
return mid;
}
if(m == 0 && n > 0){ //nums1为空,直接在nums2中找中位数
if(n == 1)
mid = (double)nums2[0];
else if(n %2 == 0)
mid = (nums2[n/2] + nums2[n/2 -1])/2.0;
else
mid = (double)nums2[n/2];
return mid;
}
vector<int> vec;
int i = 0,j = 0;
while(i < m && j < n){ //归并
if(nums1[i] <= nums2[j]){
vec.push_back(nums1[i]);
i++;
}
else{
vec.push_back(nums2[j]);
j++;
}
}
while(i < m){
vec.push_back(nums1[i]);
i++;
}
while(j < n){
vec.push_back(nums2[j]);
j++;
}
//在归并后的数组中找中位数
if(len % 2){
mid = (double)vec[len/2];
}
else{
mid = (vec[len/2] + vec[len/2 -1])/2.0;
}
return mid;
}
};