4.寻找两个有序数组中的中位数

chaoxi_todo.jpg

题目

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

示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0

示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5

题解

思路1:取巧法
虽然通过,但是没有完成题目要求“时间复杂度为 O(log(m + n))”。
该题最坏时间复杂度为O(n log n),空间复杂度为:n

def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums3 = nums1+nums2
        nums3.sort()  
        # python的 sort 内部实现机制是:Timesort
        # 时间复杂度是:最坏时间复杂度为:O(n log n),空间复杂度为:O(n)
        i = len(nums3) // 2
        j = i - int(len(nums3) % 2 == 0)
        return (nums3[i]+nums3[j]) / 2

执行结果:通过
显示详情
执行用时 :56 ms, 在所有 Python3 提交中击败了74.41%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了6.15%的用户

思路2:这个是从大佬那里粘过来的,时间复杂度对的上 O(log(m + n))

def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
        m, n = len(nums1), len(nums2)
        mark = (m+n-1) // 2
        l, r = 0, m
        while l=nums2[mark-mid-1]:
                r = mid
            else:
                l = mid+1
        middlepoints = sorted(nums1[l:l+2] + nums2[mark-l:mark-l+2])
        return (middlepoints[0] + middlepoints[1-(m+n)%2]) / 2.0

执行结果:通过
显示详情
执行用时 :44 ms, 在所有 Python3 提交中击败了96.16%的用户
内存消耗 :13.7 MB, 在所有 Python3 提交中击败了6.15%的用户

你可能感兴趣的:(4.寻找两个有序数组中的中位数)