博客
关于我
leetcode004:寻找两个正序数组的中位数_二分法
阅读量:726 次
发布时间:2019-03-15

本文共 2116 字,大约阅读时间需要 7 分钟。

寻找两个正序数组的中位数_二分法

问题描述

给定两个大小为 m 和 n 的正序数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

思路分析

暴力思路

  • 合并数组并排序:将两个数组合并,排序后找到中位数。这种方法的时间复杂度为 O((m + n)log(m + n)),虽然能解决问题,但不符合高效要求。

  • 分割数组:将每个数组分为两半,分析分割点附近的值来确定中位数。这种方法的时间复杂度为 O(min(m, n)),但仍需进一步优化。

  • 二分法优化

    为了进一步减少时间复杂度,采用二分法在两个数组中寻找合适的分割点。具体步骤如下:

  • 确定总分割点数:总分割点数为 (m + n + 1) / 2。为了保证分割点的正确性,将较短的数组作为分割点的滑动范围。

  • 二分查找分割点:在较短的数组上滑动分割点,计算对应的分割点在另一个数组中的位置。检查左右条件是否满足,若满足则确定中位数,否则调整分割点范围。

  • 处理边界条件:若分割点取到数组首或尾,添加虚拟极端值(如负无穷和正无穷)来确保分割条件成立。

  • 解决代码

    import mathclass Solution:    def findMedianSortedArrays(self, nums1: list[int], nums2: list[int]) -> float:        if len(nums1) > len(nums2):            return self.findMedianSortedArrays(nums2, nums1)                len1 = len(nums1)        len2 = len(nums2)        sum_partition = (len1 + len2 + 1) // 2        left = 0        right = len1                while left <= right:            partition1 = (left + right) // 2            partition2 = sum_partition - partition1                        maxLeft1 = nums1[partition1 - 1] if partition1 > 0 else -math.inf            minRight1 = nums1[partition1] if partition1 < len1 else math.inf            maxLeft2 = nums2[partition2 - 1] if partition2 > 0 else -math.inf            minRight2 = nums2[partition2] if partition2 < len2 else math.inf                        if maxLeft1 <= minRight2 and maxLeft2 <= minRight1:                total = len1 + len2                if total % 2 == 0:                    return (max(maxLeft1, maxLeft2) + min(minRight1, minRight2)) / 2                else:                    return max(maxLeft1, maxLeft2)            elif maxLeft2 > minRight1:                left = partition1 + 1            else:                right = partition1 - 1                raise RuntimeError("No valid partition found")

    代码解析

  • 交换数组长度:为了简化处理,将数组长度较长的作为第二个数组,较短的作为第一个数组。

  • 确定总分割点:计算总分割点数 sum_partition,用于确定分割点的范围。

  • 二分查找:在较短数组上滑动分割点,计算对应的分割点在另一个数组中的位置。检查左右条件是否满足。

  • 处理分割点:根据分割点计算左右极端值,并检查是否满足中位数条件。如果满足,返回中位数;否则调整分割点范围。

  • 边界处理:通过虚拟极端值处理分割点取到数组首或尾的情况,确保分割条件成立。

  • 优化优势

  • 时间复杂度:通过二分法减少了不必要的线性搜索,时间复杂度降为 O(log(min(m, n)))。

  • 空间复杂度:仅使用常数空间,适合大数组处理。

  • 这种方法充分利用了两个数组的有序性,显著提高了计算效率,确保在合理时间内解决问题。

    转载地址:http://hwhlz.baihongyu.com/

    你可能感兴趣的文章
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    Python听写汇总结果
    查看>>
    python吊打Excel?屁!那是你不会用!
    查看>>
    Python合并两张图片 | 先叠透明度再合并 (附Demo)
    查看>>
    python各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>
    Python变量与运算符
    查看>>
    Python变量/运算符/函数/模块/string
    查看>>
    python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
    查看>>