There are two sorted arrays nums1 and nums2 of size m and n respectively.算法
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).数组
Example 1:.net
nums1 = [1, 3] nums2 = [2]code
The median is 2.0get
Example 2:同步
nums1 = [1, 2] nums2 = [3, 4]博客
The median is (2 + 3)/2 = 2.5it
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。io
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。class
1.本身的想法是 一共m + n 个,咱们能够新建一个List 而后每把最小的数放进去,代码以下:
class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ leng = len(nums1) + len(nums2) tmpLen = leng//2 + 1 newList = [0]*tmpLen i = 0 j = 0 for k in range(tmpLen): if i == len(nums1): newList[k] = nums2[j] j += 1 elif j == len(nums2): newList[k] = nums1[i] i += 1 else: if nums1[i] < nums2[j]: newList[k] = nums1[i] i += 1 else: newList[k] = nums2[j] j += 1 if leng %2 == 0: return (newList[tmpLen - 2] + newList[tmpLen - 1])/2 else: return newList[tmpLen - 1]
2.相似与折半查找的思路,
因为题目要求的时间复杂度是(log(m+n)),若是咱们直接把两个数组整合一块儿,那么时间复杂度确定超过(log(m+n))。因此整理确定是不行的。那么还有什么方法吗?答案是确定的。
首先咱们要先了解中位数的概念,中位数就是有序数组的中间那个数。那么若是咱们将比中位数小的数和比中位数大的数去掉一样的个数,中位数的值也不会变化(数组的个数为偶数的时候另外讨论,由于那时候中位数是中间两个数的平均值,因此中位数旁边两个数不能去掉)。
因此咱们不妨试着将数组长度不断缩短。这里不妨提出一个引理。假设有两个有序数组am,bn,他们整合后的有序数组为cn+m。他们的中位数分别是Am/2,Bn/2,C(m+n)/2。若是Am/2 < Bn/2,则 A0…m/2 <= C(m+n)/2 <= Bn/2…n 。
引理证实:
假设 Am/2 > C(m+n)/2 ,那么 Bn/2 > C(m+n)/2,因此在数组Am里有大于m/2个数大于C(m+n)/2,在数组Bn里也有n/2个数大于C(m+n)/2
也就是说在Cn+m里有(m+n)/2个数大于C(m+n)/2,此时就C(m+n)/2再也不是数组Cn+m的中位数。
因此A0…m/2 <= C(m+n)/2。
同理可得C(m+n)/2 <= Cn/2…n 。
根据上述引理,咱们不妨设m>n,那么咱们根据判断两个数组的中位数大小,每一个数组每次减小n/2长度,直到n为1。如此,咱们经过减小log(n)次能够获得答案。这种方法的时间复杂度是(log(min(m,n)))。
class Solution: def getMedian(self,nums): size = len(nums) if size == 0: return [0,0] if size % 2 == 1: return [nums[size//2],size//2] else: return [(nums[size//2 - 1] + nums[size//2])/2,size//2] def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ size1 = len(nums1) # ig longer size2 = len(nums2) if size1 < size2: return self.findMedianSortedArrays(nums2,nums1) m1 = self.getMedian(nums1) m2 = self.getMedian(nums2) if size2 == 0: return m1[0] if size2 == 1: if size1 == 1: return (m1[0] + m2[0])/2 if size1 % 2 == 0: if nums2[0] < nums1[size1//2 - 1]: return nums1[size1//2 -1] if nums2[0] > nums1[size1//2]: return nums1[size1//2] else: return nums2[0] else: if nums2[0] < nums1[size1//2 - 1]: return (nums1[size1//2 - 1] + nums1[size1//2])/2 if nums2[0] > nums1[size1//2 + 1]: return (nums1[size1//2 + 1] + nums1[size1//2])/2 else: return (nums2[0] + nums1[size1//2])/2 if size1 % 2 == 0: if size2 % 2 == 0: if nums1[size1//2 - 1] > nums2[size2//2 - 1] and nums2[size2//2] > nums1[size1//2]: return m1[0] if nums1[size1//2 - 1] < nums2[size2//2 - 1] and nums2[size2//2] < nums1[size1//2]: return m2[0] if m1[0] < m2[0]: return self.findMedianSortedArrays(nums1[m2[1]:],nums2[:size2 - m2[1]]) if m1[0] > m2[0]: return self.findMedianSortedArrays(nums1[:size1 - m2[1]],nums2[m2[1]:]) else: return m1[0]
本文同步分享在 博客“SoWhat1412”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。