题目:
给定两个排序数组,求其中位数。要求时间复杂度O(log(m+n))。
解析:
记数组1大小m,数组2大小n,那么中位数为合并后的排序数组的最中间两个数字nums[mid1] nums[mid2]的平均值,或者最中间的那个数字nums[mid1]。使用两个指针i,j遍历每个数组,判断其数字nums1[i]和nums2[j]大小,小的作为合并后数组的当前值,用一个变量index记录合并后数组的索引。若一个数组遍历完,则遍历剩余的数组,否则比较当前值,当index=mid1和mid2时,记录两个值。暂时实现时间复杂度O(m+n)的一趟扫描算法。O(log(m+n))留待日后解决。
参考答案
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int len=nums1.size()+nums2.size(); //总个数
int index=len/2; //中间位置
int i=0,j=0; //遍历下标
int num=0; //记录当前下标数值
float temp1=0,temp2=0; //记录中位数的值,奇数时只有temp2;偶数个数时(temp2+temp1)*0.5
if(nums1.size()==0) //nums1数组元素个数为0时
{
if(nums2.size()%2==0)
{
return (nums2[nums2.size()/2]+nums2[(nums2.size()/2)-1])*0.5; //乘以0.5或是1.0将int转换成float
}
else
{
return nums2[nums2.size()/2]*1.0;
}
}
if(nums2.size()==0) //nums2数组元素个数为0时
{
if(nums1.size()%2==0)
{
return (nums1[nums1.size()/2]+nums1[(nums1.size()/2)-1])*0.5;
}
else
{
return nums1[nums1.size()/2]*1.0;
}
}
while(num<=index)
{
if(i>=nums1.size() && j<nums2.size()) //nums1元素遍历完
{
if(num==(index-1))
{
temp1=nums2[j];
}
if(num==index)
{
temp2=nums2[j];
}
j++;
}
else if(i<nums1.size() && j>=nums2.size()) //nums2元素遍历完
{
if(num==(index-1))
{
temp1=nums1[i];
}
if(num==index)
{
temp2=nums1[i];
}
i++;
}
else if(nums1[i]>=nums2[j])
{
if(num==(index-1))
{
temp1=nums2[j];
}
if(num==index)
{
temp2=nums2[j];
}
j++;
}
else
{
if(num==(index-1))
{
temp1=nums1[i];
}
if(num==index)
{
temp2=nums1[i];
}
i++;
}
num++;
}
return (len%2==0)?((temp1+temp2)/2)*1.0:temp2*1.0;;
}
};