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
解答:
一开始题目都没看懂,还以为是求每个数组中位数在取平均值。看了题解才知道是把两数组看成一个整体求中位数。因为一个有序数组的中位数很容易求,所以可以考虑将两个数组合并成一个有序的数组,再去相应位置的值即可。当然这样时间复杂度肯定不满足条件,时间复杂度要求为log一般用二分思想,看了别人的解法,我还没完全弄懂,这里就先给出最笨的解法,锻炼一下coding能力。
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length1 = nums1.length;
int length2 = nums2.length;
//有一个数组为空的情况:
if (length1 == 0) {
if (length2 % 2 == 0) {
return (nums2[length2 / 2] + nums2[(length2 - 1) / 2]) / 2.0;
} else {
return nums2[length2 / 2];
}
}
if (length2 == 0) {
if (length1 % 2 == 0) {
return (nums1[length1 / 2] + nums1[(length1 - 1) / 2]) / 2.0;
} else {
return nums1[length1 / 2];
}
}
//两数组都不为空
int[] temp = new int[length1 + length2];
int count = 0;
int i = 0, j = 0;
while (count != length1 + length2) {
//有一个数组已经遍历完
if (i == length1) {
while (j != length2) {
temp[count++] = nums2[j++];
}
break;
}
if (j == length2) {
while (i != length1) {
temp[count++] = nums1[i++];
}
break;
}
//两个数组都还在遍历,取两者之中较小放入合并数组
if (nums1[i] <= nums2[j]) {
temp[count++] = nums1[i++];
} else {
temp[count++] = nums2[j++];
}
}
//根据合并后数组长度奇偶取中位数
if (count % 2 == 0) {
return (temp[count / 2] + temp[(count - 1) / 2]) / 2.0;
} else {
return temp[count / 2];
}
}
本文探讨了如何找到两个已排序数组的中位数,提出了将两数组合并并排序后查找中位数的方法,尽管此方法时间复杂度较高,但有助于理解基本算法原理。
276

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



