zoukankan      html  css  js  c++  java
  • 寻找两个正序数组的中位数-python

    # 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 
    #
    #
    #
    # 示例 1:
    #
    #
    # 输入:nums1 = [1,3], nums2 = [2]
    # 输出:2.00000
    # 解释:合并数组 = [1,2,3] ,中位数 2


    方法:划分数组法,时间复杂度O(logmin(m,n))

    def findMedianNum(nums1, nums2):
        """ 参考:https://blog.csdn.net/weixin_42721167/article/details/112637470
        :param nums1:
        :param nums2:
        :return:
        """
        m = len(nums1)
        n = len(nums2)
        MAX_NUM = 10 ** 6
        if m > n:
            return findMedianNum(nums2, nums1)
        if m == 0:
            return nums2[n // 2] if n % 2 == 1 else (nums2[n // 2 -1 ] + nums2[(n // 2)]) / 2
        if n == 0:
            return nums1[m // 2] if m % 2 == 1 else (nums1[m // 2 -1] + nums1[(m // 2)]) / 2
        left, right = 0, m  # 左右指针,寻找划分点
        median1, median2 = 0, 0  # 前后半部分中位数
        i, j = 0, 0  # nums1, nums2 划分点
        numsim1, numsi, numsjm1, numsj = 0, 0, 0, 0
        while left <= right:
            print(left)
            i = (left + right) // 2
            j = (m + n + 1) // 2 - i  # 要满足i+j是总长度的一半
            # 上下左右四个方位进行控制
            numsim1 = (nums1[i - 1] if i != 0 else -MAX_NUM)
            numsi = (nums1[i] if i != m else MAX_NUM)
            numsjm1 = (nums2[j - 1] if j != 0 else -MAX_NUM)
            numsj = (nums2[j] if j != n else MAX_NUM)
            if numsim1 <= numsj:
                median1, median2 = max(numsim1, numsjm1), min(numsi, numsj)
                left = i + 1
            else:
                right = i - 1
        return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1
    时刻记着自己要成为什么样的人!
  • 相关阅读:
    vue 启动报错:`TypeError: Cannot read property 'range' of null`
    手动创建自己的npm包
    uni-app 拦截页面传参
    uni-app的vue.config.js
    插入排序
    选择排序
    设计模式--享元模式
    设计模式--代理模式
    原型链图片
    深度优先遍历和广度优先遍历
  • 原文地址:https://www.cnblogs.com/demo-deng/p/14928444.html
Copyright © 2011-2022 走看看