寻找两个正序数组的中位数-4(hard)

给定两个大小分别为 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
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000


方法一:暴力解法

简单粗暴,先将两个数组合并,两个有序数组的合并也是归并排序中的一部分。然后根据奇数,还是偶数,返回中位数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var findMedianSortedArrays = function (nums1, nums2) {
let p1 = nums1;
let p2 = nums2;
let p3 = [...p1, ...p2]; //ES6新语法很好用,p3得出来的是拼接后的数组
let p4 = p3.sort((a, b) => a - b); //进行从小到大排序
n = p4.length;
if (!p4) {
return 0;
} else {
if (n % 2 !== 0) { //若长度不能被2整除则为奇数,去获取他的中位数
let i = Math.floor(n / 2)
return p4[i]
} else { //若长度为偶数,寻找中间两个数字除2就为答案啦
let j = Math.floor(n / 2) - 1;
return ((p4[j] + p4[j + 1]) / 2)
}
}
};

时间复杂度:遍历全部数组 (m+n)(m+n), 空间复杂度:开辟了一个数组,保存合并后的两个数组 O(m+n)O(m+n)

参考文章

LeetCode-Solution