【力扣】4. 寻找两个正序数组的中位数
题目:
给定两个大小为m
和n
的正序(从小到大)数组 nums1
和 nums2
。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))
。
你可以假设 nums1
和 nums2
不会同时为空。
简单思路:(复杂度不满足要求)
将这两个数组重排成为一个大数组,取中间的那个数即可。这种时间复杂度为O(m+n)
代码:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
total_len = len(nums1) + len(nums2)
mid_idx = total_len // 2
tem = []
while nums1 and nums2:
if nums1[0] <= nums2[0]:
tem.append(nums1.pop(0))
else:
tem.append(nums2.pop(0))
if not nums1 or not nums2:
tem += nums1 if nums1 else nums2
if total_len % 2 == 0: #偶数
return (tem[mid_idx]+tem[mid_idx-1])/2
else:
return float(tem[mid_idx])
进阶思路:
模拟出栈的方式,每次弹出两个数组中较小的数组,这样的话时间复杂度为O((m+n)/2)
代码:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
counter = 0
total_len = len(nums1)+len(nums2)
if total_len % 2 == 0:
mid = total_len//2
else:
mid = total_len//2 + 1
#res = []
if len(nums1) != len(nums2):
tem = [float('inf') for _ in range(abs(len(nums1) - len(nums2)))]
if len(nums1) < len(nums2):
nums1 += tem
else:
nums2 += tem
while nums1 and nums2 and counter < mid:
if nums1[0] <= nums2[0]:
a = nums1.pop(0)
counter += 1
else:
a = nums2.pop(0)
counter += 1
if total_len % 2 == 0:
if not nums1:
return (a+nums2[0]) / 2
elif not nums2:
return (a+nums1[0]) / 2
return (a+min(nums1[0], nums2[0]))/2
else:
return float(a)
终极思路:
折半删除法。将寻找中位数等同于寻找第k小的数,每次都删除 k // 2
个数字,具体证明见力扣大神整理。
代码还没写出来。。。。