给定两个大小为 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
提示:
nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106
第一次解题
var findMedianSortedArrays = function(nums1, nums2) {
const nums = [].concat(nums1, nums2).sort((a, b) => a - b)
if (nums.length === 1) {
return nums[0]
}
const mid = nums.length / 2
let even = mid % 1 === 0
if (even) {
return (nums[mid - 1] + nums[mid]) / 2
}
return nums[Math.floor(mid)]
};
解题思路 先合并2个数组然后排序,判断中位数下标是否是偶数,是偶数则返回中位数与进位下标的和除以2,奇数则直接向下取整返回下标值。 但是由于使用了sort方法,v8引擎中sort方法是使用快排实现的,也就是nlogn级别的时间复杂度 所以总结下来时间复杂度为(m + n)log(m + n)级别,并未实现进阶目标。 于是查看题解发现 需要使用二分法来做