题目描述
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出并返回这两个正序数组的中位数。
示例
cssCopy code
nums1 = [1,3]
nums2 = [2]
则中位数是 2.0
解法
我们可以将两个数组合并为一个有序数组来解决此问题。因为两个数组都是有序的,所以我们可以使用两个指针分别指向两个数组中的元素,比较这两个元素的大小,并将较小的元素加入到新数组中,直到新数组的长度达到中位数的位置。如果两个数组的总长度为奇数,则中位数就是新数组中的最后一个元素;否则,中位数就是新数组中最后两个元素的平均值。
function findMedianSortedArrays(nums1: number[], nums2: number[]): number {
const mergedArr: number[] = [];
let i = 0, j = 0;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
mergedArr.push(nums1[i]);
i++;
} else {
mergedArr.push(nums2[j]);
j++;
}
}
while (i < nums1.length) {
mergedArr.push(nums1[i]);
i++;
}
while (j < nums2.length) {
mergedArr.push(nums2[j]);
j++;
}
const len = mergedArr.length;
if (len % 2 === 0) {
return (mergedArr[len / 2 - 1] + mergedArr[len / 2]) / 2;
} else {
return mergedArr[Math.floor(len / 2)];
}
}
时间复杂度
该算法的时间复杂度为 ,其中 和 分别为两个数组的长度。原因是我们需要遍历两个数组中的所有元素,并将其插入到新数组中,插入操作的时间复杂度为 。
空间复杂度
该算法的空间复杂度为 ,其中 和 分别为两个数组的长度。原因是我们需要创建一个新数组来存储合并后的有序数组。