一、题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- -106 <= nums1[i], nums2[i] <= 106
二、题解
-
有一个是空数组,直接输出中位数
- nums1空
- nums2空
- 奇数个直接返回
- 偶数个中间两个取平均
-
合并数组
- 创建新的总数组
- nums1先空
- nums2先空
- nums1、nums2都不空,但是出现重叠,如1、3、5,2、4、6
-
再返回中位数
- 奇数个直接返回
- 偶数个中间两个取平均
三、代码
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[] nums = new int[m + n];
//nums1为空
if (m == 0) {
if (n % 2 == 0) {
return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
} else {
return nums2[n / 2];
}
}
//nums2为空
if (n == 0) {
if (m % 2 == 0) {
return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
} else {
return nums1[m / 2];
}
}
//都不空,考虑可能出现重合,如:1,3,5 / 2,3,7
int count = 0, i = 0, j = 0;
while(count != (m + n)){ //未全部合并时
if ( i == m) { //nums1已经全部合并入总数组
while (j != n) { //只需合并nums2比nums1多的项数
nums[count++] = nums2[j++];
}
break;
}
if (j == n) { //nums2已经全部合并入总数组
while (i != m) { //只需合并nums1比nums2多的项数
nums[count++] = nums1[i++];
}
break;
}
//nums1 nums2对应的当前值比较大小后,并入总数组
if (nums1[i] < nums2[j]) {
nums[count++] = nums1[i++];
} else {
nums[count++] = nums2[j++];
}
}
// 合并后总数组输出中位数
if (count % 2 == 0) {
return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
} else {
return nums[count / 2];
}
}
四、结果
五、说明
本文章仅用于记录个人做题记录
由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。