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

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

题目描述


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


运行结果


微信图片_20221112145108.jpg


相关文章
|
6月前
|
Java C++ Python
leetcode-977:有序数组的平方
leetcode-977:有序数组的平方
48 0
|
6月前
|
算法 Java
LeetCode寻找两个有序数组的中位数打败100%人
LeetCode寻找两个有序数组的中位数打败100%人
59 0
|
6月前
|
算法
六六力扣刷题数组之有序数组的平方
六六力扣刷题数组之有序数组的平方
46 0
|
算法 编译器
LeetCode4-寻找两个有序数组的中位数
LeetCode4-寻找两个有序数组的中位数
每日一题——有序数组的平方
每日一题——有序数组的平方
|
算法 API
leetcode:4.寻找两个有序数组的中位数
题目比较好理解,如果只看最后结果的话,很容易想到把两个数组合并,并且排序后就可以轻松的找到中位数,但这样不符合题目的意思
86 0
|
算法
【leedcode】0004. 两个有序数组的中位数
【leedcode】0004. 两个有序数组的中位数
77 0
|
机器学习/深度学习 人工智能
每日一题:Leetcode977 有序数组的平方
每日一题:Leetcode977 有序数组的平方
leetcode 977 有序数组的平方
leetcode 977 有序数组的平方
83 0
leetcode 977 有序数组的平方