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

216 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

前情提要

需求是给你两个数组m和n,然后从两个数组中找到两个数组中的中位数。
属于进阶型的难度要求是实现复杂度为O(log (m+n))的算法。

tips:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

题目分析

  • 由需求可以得知主要考验的是数组合并和排序以及查找的方法。
  • 给定两个数组,然后找出这两个数组的中位数。最先想到的是先合并两个数组,然后排一次序,最后根据合并后的数组元素的个数为奇数还是偶数来决定是直接去中间值还是中间两个值得平均值。
  • 可以通过js的数组上得方法sort来进行排序,通过concat或者es6的扩展运算符来进行合并数组。

第一种方案:

思路:遍历数组,用给定的整数减去每个数,然后调用lastIndexOf方法获取差数在数组中的下标
代码

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let newArr = [...nums1, ...nums2].sort((a,b)=>{return a-b});
    if (newArr.length%2 == 0) {
        return ((newArr[(newArr.length/2)-1] + newArr[(newArr.length/2)])/2)
    } else {
        return newArr[((newArr.length-1)/2)]
    }
};

提交情况:

WX20220402-211510@2x.png

第二种方案

想啥呢?第二种方案还没有想出来...

总结

  • 不过根据查阅相关资料看到sort函数的时间复杂度是n*log2n。不符合进阶要求。
  • sort函数的原理:不是简单的快排STL的sort()算法,数据量大时采用的Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷,就改用插入排序。
  • 由此可见这道题的主要难点在算法复杂度应为O(log(m+n))上...
  • 而根据O(log (m+n)) 的时间复杂度要求,符合进阶的排序方式的应该是归并排序算法... 你还有其他更好的方法吗?在评论区里发出来,让我们一起学习下。