题目描述
给定两个大小为 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
来源:LeetCode
思路
这题感觉难度达不到困难。归并排序中的合并,然后再取中位数就可以了。时间复杂度 O(m + n);
解法
const merge = (nums1, nums2) => {
let i1 = 0;
let i2 = 0;
const result = [];
while (i1 < nums1.length && i2 < nums2.length) {
if (nums1[i1] < nums2[i2]) {
result.push(nums1[i1]);
i1++;
} else {
result.push(nums2[i2]);
i2++;
}
}
while (i1 < nums1.length) {
result.push(nums1[i1]);
i1++;
}
while (i2 < nums2.length) {
result.push(nums2[i2]);
i2++;
}
return result;
};
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
const findMedianSortedArrays = (nums1, nums2) => {
const mergedNums = merge(nums1, nums2);
const length = mergedNums.length;
const halfLength = length / 2;
if (length % 2) {
return mergedNums[~~halfLength];
}
return (mergedNums[halfLength] + mergedNums[halfLength - 1]) / 2;
};