【每日LeetCode】手把手教你刷题之寻找两个正序数组的中位数

793 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

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

这是力扣第4题

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n))

image.png

解题思路

这是一道困难题,十分经典的难题,说它经典是因为用 js 的思路来处理它十分简单,用其他思路处理起来就会比较困难,其次就是因为它是出现的最早的一道困难题,很有记录意义。接下来我就来介绍一下这道我通过看完题解后才浅浅理解的困难题吧。(部分解法思路会省略相关代码)

二分法

二分法是十分常用的方法了,在之前的文章中就经常提到过。对于此题,使用二分法解题的思路如下: 首先通过二分找到长度较小的数组,找到这个数组二分的位置。然后再根据这个二分的位置和两个数组的总长度找到另一个数组二分的位置,比较这两个位置的四个数是否满足交叉小于等于。如果满足条件则说明可以返回最终结果,不满足的话则继续进行二分直到找到为止。

合并排序法

这种方法思路清晰,代码简单易懂,就是我上面提到的 js 思路来解决。用这种思路来解决此题,就相当于将困难难度的题目降低到简单难度。整体思路如下:

  • 首先将两个数组依次合并、排序,目的是为了取其中间值
  • 然后再判断合并后的数组长度是否为偶数,如果是则取中间的两个值,然后除以二;不是的话就直接取中间值
  • 最后返回最终结果即可

相关代码如下:

var findMedianSortedArrays = function(nums1, nums2) {
    const sumAry = [...nums1, ...nums2].sort((a, b) => a - b);
    const le = sumAry.length;
    if (le % 2 !== 0) {
        return  sumAry[Math.floor(le/2)];
    };
    const inSum = sumAry[Math.floor(le/2) - 1] + sumAry[Math.floor(le/2)];
    return (inSum / 2).toFixed(5);
};

这种思路十分简单,写完之后甚至会认为它是一道简单题。总之,对于这题,大家可以好好研究一下,以便思考其他的思路。

总结

以上就是对 力扣 4 题寻找两个正序数组的中位数 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。