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]))


目录
相关文章
|
4月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
42 3
|
4月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
163 10
|
4月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
181 4
|
4月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
36 0
|
4月前
|
算法 C++ Python
Leecode 101刷题笔记之第三章:和你一起你轻松刷题(Python)
本文是关于LeetCode算法题的刷题笔记,主要介绍了使用双指针技术解决的一系列算法问题,包括Two Sum II、Merge Sorted Array、Linked List Cycle II等,并提供了详细的题解和Python代码实现。
33 0
|
4月前
|
算法 C++ 索引
Leecode 101刷题笔记之第二章:和你一起你轻松刷题(Python)
本文是关于LeetCode 101刷题笔记的第二章,主要介绍了使用Python解决贪心算法题目的方法和实例。
30 0
|
6月前
|
存储 数据处理 索引
如何删除 Python 数组中的值?
【8月更文挑战第29天】
286 8
|
6月前
|
索引 Python
向 Python 数组添加值
【8月更文挑战第29天】
86 8
|
6月前
|
存储 缓存 C语言
|
6月前
|
存储 测试技术 Python
Python 数组和列表有什么区别?
【8月更文挑战第29天】
1254 4

热门文章

最新文章