LeetCode热题(JS版)- 4. 寻找两个有序数组的中位数

195 阅读1分钟

题目描述

给定两个大小为 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)];
  }
}

时间复杂度

该算法的时间复杂度为 O(m+n)O(m+n),其中 mmnn 分别为两个数组的长度。原因是我们需要遍历两个数组中的所有元素,并将其插入到新数组中,插入操作的时间复杂度为 O(1)O(1)

空间复杂度

该算法的空间复杂度为 O(m+n)O(m+n),其中 mmnn 分别为两个数组的长度。原因是我们需要创建一个新数组来存储合并后的有序数组。