4.两个排序数组的中位数
-
题目描述:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。 -
示例1
nums1 = [1, 3] nums2 = [2] 中位数是 2.0
-
示例2
nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5
将两个数组合并,然后从中找取合并数组中的中位数即可,代码如下:
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] array = new int[nums1.length+nums2.length]; //合并数组
System.arraycopy(nums1, 0, array, 0, nums1.length); //将数组复制到合并数组中
System.arraycopy(nums2, 0,array, nums1.length,nums2.length); //将数组复制到合并数组中
Arrays.sort(array); //对数组进行排序
if(array.length%2!=0) { //查找中位数
return array[array.length/2];
}
else
{
return (array[array.length/2]+array[array.length/2-1])/2.0; //查找中位数
}
}
分析上面的代码我们可知,将两个数组复制到新数组的时间复杂度分别为O(m)、O(n),排序的时间复杂度O((n+m)log(n+m))、返回值只需O(1),最后的时间复杂度为O((n+m)log(n+m)),并且用了O(n+m)的辅助空间。