数组算法2-寻找两个正序数组的中位数

61 阅读1分钟

寻找两个正序数组的中位数

题目要求:

给定两个大小分别为 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,暂存新数组。遍历数组1的同时,遍历数组2,循环判断当数组1的值大于数组2的值,就保存数组2的值,反之保存数组1的值。

因为可能存在数组2的值没有被遍历完的可能性,所以还要循环判断数组2有没有遍历完。

算法代码:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @author zxqj 2024/1/8 10:18
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let arrayList = [];
    let k = 0;
    for (let i = 0; i < nums1.length; i++) {
      for (let j = k; j < nums2.length; j++) {
        if (nums1[i] > nums2[j]) {
          arrayList.push(nums2[j]);
          k++;
        }
        else break;
      }
      arrayList.push(nums1[i]);
    }
    if (k < nums2.length) {
      for (let j = k; j < nums2.length; j++) {
        arrayList.push(nums2[j]);
      }
    }
    const total = nums1.length + nums2.length;
    if (total % 2 === 1) {
      const a1 = Math.floor(total / 2);
      return arrayList[a1];
    } else {
      const a1 = Math.floor(total / 2)-1;
      const a2 = Math.floor(total / 2);
      const data = (arrayList[a1] + arrayList[a2]) / 2;
      return data;
    }
};

运行结果:

image.png