这道题和第2题结构上类似,我说的结构类似不是算法类似。
大概意思是,同样都是有三种情况:
第一种:两个Array的长度length是否都为0,如果都为0,则返回0.0
第二种:如果有一个为0,则返回另一个Array的中间值
第三种:如果都不为0,这个是一般情况,则在创建一个数组把两个数组都放进去,重新排序,再返回中间值。
其中,第三种的重新排序有一个简单的算法,并不需要用冒泡,快排之类的排序
Arrays.sort(nums3);/*其中nums3是新创建的新数组,包含nums1和nums2的所有值*/继续。
取中间值这个就很简单了。判断是否为奇数或偶数,然后在分别取中间值,奇数就直接取中间值(一个),偶数是两个,加和除以2即可。
注意一定要加上double的强制转换,我踩了这个坑!!!!!!
注意一定要加上double的强制转换,我踩了这个坑!!!!!!
注意一定要加上double的强制转换,我踩了这个坑!!!!!!
说三遍!!!!!!!!
if( nums2.length % 2 == 0)
ave2 = ((double)nums2[(nums2.length-1)/2]+(double)nums2[(nums2.length+1)/2])/2;
else
ave2 = nums2[nums2.length/2];剩下的就没有什么难度了。
下面贴代码。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double ave1 = 0.0, ave2 = 0.0;
if( nums1.length == 0 && nums2.length == 0)
return 0.0;
else if( nums1.length == 0){
if( nums2.length % 2 == 0)
ave2 = ((double)nums2[(nums2.length-1)/2]+(double)nums2[(nums2.length+1)/2])/2;
else
ave2 = nums2[nums2.length/2];
return ave2;
}
else if( nums2.length == 0){
if( nums1.length % 2 == 0)
ave1 = ((double)nums1[(nums1.length-1)/2]+(double)nums1[(nums1.length+1)/2])/2;
else
ave1 = nums1[nums1.length/2];
return ave1;
}else{
int nums3[] = new int [nums2.length+nums1.length];
for( int i = 0; i < nums1.length; i++)
nums3[i] = nums1[i];
for( int i = nums1.length; i < nums3.length; i++)
nums3[i] = nums2[i-nums1.length];
Arrays.sort(nums3);
if( nums3.length % 2 == 0)
ave1 = ((double)nums3[(nums3.length-1)/2]+(double)nums3[(nums3.length+1)/2])/2;
else
ave1 = nums3[nums3.length/2];
return ave1;
}
}
}
我真的要吐槽这个代码排版。
好气哦,改了好几次。
本文介绍了一种高效算法来找到两个已排序数组的中位数。该算法首先检查数组长度,对于空数组的情况给出特定处理。接着,通过合并两个数组并排序,最后根据合并数组的长度确定返回单个中位数还是两个中位数的平均值。


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



