LeeCode-寻找两个正序数组的中位数(python)

简介: LeeCode-寻找两个正序数组的中位数(python)

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


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/median-of-two-sorted-arrays


这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。


暴力求解:


def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]):
  nums, m, n = sorted(nums1+nums2), len(nums1), len(nums2)
  return (nums[(m+n-1)//2] + nums[(m+n)//2]) / 2


二分查找:


思路:将一个数组中的元素逐个插入到第二个数组中,到达中位数的下标即停止。


python3


# -*- coding: utf-8 -*-
# @Time : 2022/7/6 14:51
# @Author : 凌贤文
# @Email : lingxw@zjnu.edu.cn
class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        m, n = len(nums1), len(nums2)
        # 如果(m + n)为奇数,直接赋给index
        index = (m + n) // 2 if (m + n) % 2 else int((m + n) / 2)
        # 如果num1、num2、不为空,且num2>num1的第一个值
        if nums1 and nums2 and nums2[0] > nums1[0]:
            # 交换nums1和nums2的值
            nums1, nums2 = nums2, nums1
            # 交换n和m的值
            m, n = n, m
        # 这一步的操作是因为俩个数组都是正序数组,将第一个数大的数组放到前面
        # 开始将一个数组中的元素逐个插入到第二个数组中,到达中位数的下标即停止。
        i, _n = 0, n
        for num in nums1:
            while i <= index:
                if i + 1 >= _n or nums2[i] <= num <= nums2[i + 1]:
                    nums2.insert(i + 1, num)
                    i += 1
                    _n += 1
                    break
                i += 1
        return nums2[index] if (m + n) % 2 else (nums2[index - 1] + nums2[index]) / 2
        # 中间有些细节需要注意
if __name__ == '__main__':
    sol = Solution()
    print(sol.findMedianSortedArrays([1, 3], [2]))
    print(sol.findMedianSortedArrays([1, 2], [3, 4]))


目录
相关文章
|
11天前
|
BI 测试技术 索引
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-1
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
7天前
|
Python
NumPy 是 Python 中的一个重要的科学计算包,其核心是一个强大的 N 维数组对象 Ndarray
【6月更文挑战第18天】NumPy的Ndarray是科学计算的核心,具有ndim(维度数)、shape(各维度大小)、size(元素总数)和dtype(数据类型)属性。方法包括T(转置)、ravel()(扁平化)、reshape()(改变形状)、astype()(转换数据类型)、sum()(求和)及mean()(计算平均值)。更多属性和方法如min/max等可在官方文档中探索。
26 5
|
7天前
|
Python
NumPy 是 Python 的一个强大的科学计算库,它允许你创建各种类型的数组
【6月更文挑战第18天】**NumPy**是Python的科学计算库,用于创建和操作多维数组。常用数组生成方法包括:`np.array()`从列表转换为数组;`np.zeros()`生成全零矩阵;`np.ones()`创建全一矩阵;`np.linspace()`产生等差序列;`np.arange()`创建等差数列;以及`np.eye()`生成对角线为1的二维数组。更多方法可查阅NumPy官方文档。
16 2
|
16天前
|
存储 SQL 算法
LeetCode第53题:最大子数组和【python 5种算法】
LeetCode第53题:最大子数组和【python 5种算法】
|
20天前
|
算法 搜索推荐 Java
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
10 3
|
20天前
|
存储 算法 Java
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
12 1
|
5天前
|
人工智能 测试技术 Python
Python数组类+AI插件
Python数组类+AI插件
|
11天前
|
存储 API C语言
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-2
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
16天前
|
存储 算法 数据挖掘
LeetCode第33题:搜索旋转排序数组【python】
LeetCode第33题:搜索旋转排序数组【python】
|
16天前
|
SQL 算法 数据挖掘
LeetCode 第四题:寻找两个正序数组的中位数 【4/1000 】【python + go】
LeetCode 第四题:寻找两个正序数组的中位数 【4/1000 】【python + go】