【力扣刷题记4】——《寻找两个正序数组的中位数》

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

  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

提示:

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

二、题目和思路分析:

这道题虽然标的困难,但实际上从解出题的角度来说,并不算困难。题目也比较易懂,意思是合并数组,然后取出数组的中位数即可。

合并数组可以用concat()方法,取中位数可以使用取余的方法判断,如果取余结果为1,说明是奇数,直接取数组下标中位数对应的值即可,如果取余结果为0,则说明是偶数,应该取下标两个中位数对应值的平均值。

这么想着,我就把代码敲出来了,结果运行发现不对,原来是忘记合并数组后要进行排序,于是又加了sort((a,b)=>{a-b})进行正序排序,完美搞定!

说到这,题目中还有重要的一点忘记了,【题目要求:算法的时间复杂度应该为 O(log (m+n)) 】,这是什么意思呢?网上有张图大家可以看一下:

image.png 可知,当数组长度不断提升时,所需时间并不应该指数型增长,而是一个逐渐放缓的速度,在上面的解题思路中也可以看出,我们的计算时间并不会受数组长度的大幅度影响,而是log(m+n)的曲线。

三、代码:

代码实现如下:

var findMedianSortedArrays = function(nums1, nums2) {
    let arr = nums1.concat(nums2).sort((a, b) => a - b)
    let length = arr.length
    let i = 0
    let res = 0
    console.log(arr,length,i,res)
    if(length % 2 == 1){
        i = --length/2
        res = arr[i]
    }else{
        i = length/2
        res = (arr[i]+arr[i-1])/2
    }
    return res
};
复制代码

四、总结:

解题的过程要认真仔细,一点失误就会导致答案不对,关于大O表示法,还要复习一下数学知识,最重要的还是思路。

加油吧!

image.png

おすすめ

転載: juejin.im/post/7076621387988729887