【刷题】寻找两个有序数组的中位数

266 阅读2分钟

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

刷题打卡第4天第4篇。

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。

掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。

Let's GO!

题目描述

给定两个大小分别为 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

解题思路

这道题很简单,不管是题目说明还是提示都给出了我们解题思路。

  1. 首先我们需要把给定的两个有序数组进行合并

  2. 分两种情况来求出中位数:

2.1 一种情况是长度是偶数,则中位数是中间两个数之和再除以2得到中位数;

2.2 另一种情况是合并后的数组长度是奇数,则最中间的元素就是我们要找到的中位数。

AC代码

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
   
    len1 := len(nums1)
    len2 := len(nums2)
    lenSum := len1+len2
    if lenSum == 0 {
        return float64(0)
    }
    l, r := 0, 0 
    a := make([]int,0,lenSum)
    for l <len1 && r < len2{
        if nums1[l] < nums2[r]{
            a = append(a,nums1[l])
            l++
        }else {
            a = append(a, nums2[r])
            r++
        }
    }
    a = append(a, nums1[l:]...)
    a = append(a, nums2[r:]...)
    if lenSum%2 != 0 {
        return float64(a[lenSum/2])
    }else {
        return (float64(a[lenSum/2-1]) + float64(a[lenSum/2]))/2
    }
}

运行结果

image.png

总结

刷题还是讲究先易后难的,今天这道题就是比较简单好上手的。之前刷的有一道难题对我这种刚开始刷题的同学实在不友好,差点要放弃~

来源声明

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/me…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif