给定两个大小为 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
思路:由条件可知 1.数组有序 2.数组不全为空 3.条件O(m+n)
可以用归并
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
if (nums1.length == 0) {
if (nums2.length % 2 == 0) {
return (nums2[nums2.length / 2] + nums2[nums2.length / 2 - 1]) / 2.0;
}
return nums2[nums2.length / 2];
}
if (nums2.length == 0) {
if (nums1.length % 2 == 0) {
return (nums1[nums1.length / 2] + nums1[nums1.length / 2 - 1]) / 2.0;
}
return nums1[nums1.length / 2];
}
int sum = nums1.length + nums2.length;
int mid = sum / 2;
int[] tmp = new int[mid + 1];
int i = 0, j = 0, index = 0;
while (i + j <= mid) {
if (nums1[i] > nums2[j]) {
tmp[index] = nums2[j];
if (j + 1 < nums2.length) {
++j;
} else {
nums2[j] = Integer.MAX_VALUE;
}
} else {
tmp[index] = nums1[i];
if (i + 1 < nums1.length) {
++i;
} else {
nums1[i] = Integer.MAX_VALUE;
}
}
++index;
if (index == mid + 1) {
break;
}
}
if (sum % 2 != 0)
return tmp[mid];
else
return (tmp[mid - 1] + tmp[mid]) / 2.0;
}