給定兩個大小爲 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;
}