一、题目描述
给定两个已经排好序的数组nums1和nums2,长度分别是m和n,要求求出这两个有序数组合并后的新数组中的中位数,并要求整个程序实现的时间复杂度为O(log(m+n))。例如数组1 nums1=[1,3],给定的数组2为 nums2=[2],则输出数组[1,2,3]的中位数2.0,若是[1,2]和[3,4],则输出中位数2.5。
二、思路解析
这道题的难点在于控制时间复杂度,由于要求的时间复杂度为O(m+n),因此只能遍历两个数组一遍。本人采取的做法是归并排序中的思想,即在两个数组中的头部设置一个指针a,b,以及新建一个新数组temp,temp用于存储两数组合并后的新数组值。每次比较指针a和b的值,若a比b小,则将a指针的值存进temp数组,a指针往前一位,计数k加1,反之亦然。k的值也即为temp数组中所保存的元素的数量,当k等于两数组长度和的一半时,此时进行判断,若m+n为奇数,则输出temp[k],否则输出(temp[k]+temp[k-1])/2。可以说,在理解了归并排序的思想后去解决此题,可以有效的得到答案。
三、代码实现
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
double out;
int i = 0, j = 0;
int length;
vector<double> temp(1000);
length = nums1.size() + nums2.size();
int mid = (nums1.size() + nums2.size()) / 2;
int flag = (nums1.size() + nums2.size()) % 2;
if(nums2.size() == 0 && (nums1.size() % 2) == 0) {
temp[0] = nums1[mid];
temp[1] = nums1[mid - 1];
out = (temp[0] + temp[1]) / 2;
return out;
} else if(nums2.size() == 0 && (nums1.size() % 2) == 1) {
return nums1[mid];
}
if(nums1.size() == 0 && (nums2.size() % 2) == 0) {
temp[0] = nums2[mid];
temp[1] = nums2[mid - 1];
out = (temp[0] + temp[1]) / 2;
return out;
} else if(nums1.size() == 0 && (nums2.size() % 2) == 1) {
return nums2[mid];
}
for(int k = 0; k < length; k++) {
if(nums1[i] <= nums2[j] && i < nums1.size()) {
temp[k] = nums1[i];
i++;
} else if(nums2[j] <= nums1[i] && j < nums2.size()) {
temp[k] = nums2[j];
j++;
} else if(j >= nums2.size()){
temp[k] = nums1[i];
i++;
} else if(i >= nums1.size()){
temp[k] = nums2[j];
j++;
}
if((flag == 1) && (k == mid)) {
out = temp[k];
break;
} else if((flag == 0) && (k == mid)) {
out = (temp[k] + temp[k - 1]) / 2;
break;
}
}
return out;
}
};
本文介绍了一种高效算法,用于找出两个已排序数组合并后的中位数,时间复杂度为O(log(m+n))。通过类似归并排序的方法,仅需遍历一次即可找到中位数。
491

被折叠的 条评论
为什么被折叠?



