【leedcode】0004. 两个有序数组的中位数

简介: 【leedcode】0004. 两个有序数组的中位数

【leedcode】0004. 两个有序数组的中位数


给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。


   示例 1:

   nums1 = [1, 3]

   nums2 = [2]

   则中位数是 2.0


   示例 2:

   nums1 = [1, 2]

   nums2 = [3, 4]

   则中位数是 (2 + 3)/2 = 2.5


方法一:时间复杂度O(m+n)

def Medianof2Arrays(num1,num2):
    n1,n2 = len(num1),len(num2)
    res = [0]*(n1+n2)
    n,i,j = 0,0,0
    while n < n1+n2:
        if i < n1 and j < n2:
            if num1[i] < num2[j]:
                res[n] = num1[i]
                i += 1
            else:
                res[n] = num2[j]
                j += 1
        elif i >= n1 and j < n2:
            res[n] = num2[j]
            j += 1
        elif i < n1 and j >= n2:
            res[n] = num1[i]
            i += 1
        n += 1
    if (n1+n2)%2:
        return res[(n1+n2)//2]
    else:
        return (res[(n1+n2)//2]+res[(n1+n2)//2-1])/2
nums1,nums2 = [1,3],[2]
print(Medianof2Arrays(nums1,nums2))
print()
nums1,nums2 = [1,2],[3,4]
print(Medianof2Arrays(nums1,nums2))



方法二:

def Medianof2Arrays(num1,num2):
    n1,n2 = len(num1),len(num2)
    if(n1>n2):
        num1,num2 = num2,num1
        n1,n2 = n2,n1
    try: Max = (num1[-1],num2[-1]) + 1
    except: Max = num2[-1] + 1
    try: Min = (num1[0],num2[0]) - 1
    except: Min = num2[0] - 1
    lo,hi = 0,2*n1
    while lo<=hi:
        c1 = (lo+hi)//2
        c2 = n1+n2-c1
        L1 = Min if c1==0 else num1[(c1-1)//2]
        R1 = Max if c1==2*n1 else num1[c1//2]
        L2 = Min if c2==0 else num2[(c2-1)//2]
        R2 = Max if c2==2*n2 else num2[c2//2]
        if L1>R2: hi = c1-1
        elif L2>R1: lo = c1+1
        else: break
    return (max(L1,L2)+min(R1,R2))/2
nums1,nums2 = [1,3],[2]
print(Medianof2Arrays(nums1,nums2))
print()
nums1,nums2 = [1,2],[3,4]
print(Medianof2Arrays(nums1,nums2))



方法三:直接用内置函数操作

def Medianof2Arrays(num1,num2):
    res = num1[:]
    res.extend(num2)
    res.sort()
    if (n:=len(res))%2:
        return res[n//2]
    else:
        return (res[n//2]+res[n//2-1])/2
nums1,nums2 = [1,3],[2]
print(Medianof2Arrays(nums1,nums2))
print()
nums1,nums2 = [1,2],[3,4]
print(Medianof2Arrays(nums1,nums2))
目录
相关文章
|
6月前
|
Java C++ Python
leetcode-977:有序数组的平方
leetcode-977:有序数组的平方
47 0
|
6月前
|
算法 Java
LeetCode寻找两个有序数组的中位数打败100%人
LeetCode寻找两个有序数组的中位数打败100%人
58 0
|
算法 编译器
LeetCode4-寻找两个有序数组的中位数
LeetCode4-寻找两个有序数组的中位数
|
Java
寻找两个有序数组的中位数
寻找两个有序数组的中位数
102 0
每日一题——有序数组的平方
每日一题——有序数组的平方
|
算法 API
leetcode:4.寻找两个有序数组的中位数
题目比较好理解,如果只看最后结果的话,很容易想到把两个数组合并,并且排序后就可以轻松的找到中位数,但这样不符合题目的意思
86 0
每日一题:Leetcode977 有序数组的平方
每日一题:Leetcode977 有序数组的平方
|
机器学习/深度学习 算法 索引
LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Easy - Medium - Medium 的水场,不得不说 LeetCode 是懂礼数的 😁。 接下来,请你跟着小彭的思路,一步步将问题做难,再将问题做简单。
89 0
leetcode 977 有序数组的平方
leetcode 977 有序数组的平方
81 0
leetcode 977 有序数组的平方
|
算法 搜索推荐
LeetCode:977. 有序数组的平方
题目描述:给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。