博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现BF算法 (附完整源码)
    查看>>
    Objective-C实现Bilateral Filter双边滤波器算法(附完整源码)
    查看>>
    Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
    查看>>
    Objective-C实现binary search二分查找算法(附完整源码)
    查看>>
    Objective-C实现binary tree mirror二叉树镜像算法(附完整源码)
    查看>>
    Objective-C实现binary tree traversal二叉树遍历算法(附完整源码)
    查看>>
    Objective-C实现BinarySearchTreeNode树算法(附完整源码)
    查看>>
    Objective-C实现binarySearch二分查找算法(附完整源码)
    查看>>
    Objective-C实现binomial coefficient二项式系数算法(附完整源码)
    查看>>
    Objective-C实现binomial distribution二项分布算法(附完整源码)
    查看>>
    Objective-C实现bisection二分法算法(附完整源码)
    查看>>
    Objective-C实现bisection二等分算法(附完整源码)
    查看>>
    Objective-C实现BitMap算法(附完整源码)
    查看>>
    Objective-C实现bitmask位掩码算法(附完整源码)
    查看>>
    Objective-C实现bitonic sort双调排序算法(附完整源码)
    查看>>
    Objective-C实现BloomFilter布隆过滤器的算法(附完整源码)
    查看>>
    Objective-C实现BMP图像旋转180度(附完整源码)
    查看>>
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>