题目
给定两个大小为 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<r:
mid = (l+r) // 2
if mark-mid-1<0 or nums1[mid]>=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%的用户