LeetCode Hard: 4. Median of Two Sorted Arrays
Posted nunca
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Hard: 4. Median of Two Sorted Arrays相关的知识,希望对你有一定的参考价值。
一、题目
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:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
题意:给定两个有序的数组,找到两个数组的中位数。总的时间复杂度不能超过O(log(m+n))
二、思路
思路一、合并两个有序数组,然后找合并之后数组的中位数。下面的Solution0是做自己写的,看到了网上同样的思路,但是代码量少了好多,见Solution1;
思路二、二分查找,递归实现 首先我们来看如何找到两个数列的第k小个数,即程序中getKth(A, B , k)函数的实现。用一个例子来说明这个问题:A = {1,3,5,7};B = {2,4,6,8,9,10};如果要求第7个小的数,A数列的元素个数为4,B数列的元素个数为6;k/2 = 7/2 = 3,而A中的第3个数A[2]=5;B中的第3个数B[2]=6;而A[2]<B[2];则A[0],A[1],A[2]中必然不可能有第7个小的数。因为A[2]<B[2],所以比A[2]小的数最多可能为A[0], A[1], B[0], B[1]这四个数,也就是说A[2]最多可能是第5个大的数,由于我们要求的是getKth(A, B, 7);现在就变成了求getKth(A\', B, 4);即A\' = {7};B不变,求这两个数列的第4个小的数,因为A[0],A[1],A[2]中没有解,所以我们直接删掉它们就可以了。这个可以使用递归来实现。
三、代码
#coding:utf-8 class Solution0: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ newnum = [None]*(len(nums1)+len(nums2)) if nums1 == None or nums2 == None: return nums1_point = len(nums1)-1 nums2_point = len(nums2)-1 new_point = len(nums1)+len(nums2)-1 while nums1_point >= 0 and nums2_point >= 0: if num1[nums1_point] > num2[nums2_point]: newnum[new_point] = nums1[nums1_point] new_point-=1;nums1_point-=1 else: newnum[new_point] = nums2[nums2_point] new_point -=1;nums2_point-=1 while nums1_point >= 0: newnum[new_point] = nums1[nums1_point] new_point-=1;nums1_point-=1 while nums2_point >= 0: newnum[new_point] = nums2[nums2_point] new_point-=1;nums2_point-=1 print(newnum) if len(newnum) % 2 != 0: median = newnum[len(newnum)//2] else: median = (newnum[len(newnum)//2-1] + newnum[(len(newnum)//2)])/2 print(median) return median
class Solution1:
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
for i in nums2:
nums1.append(i)
nums1.sort()
k=len(nums1)
if k%2==0:
return (float(nums1[int(k/2-1)])+nums1[int(k/2)])/2
else:
return nums1[int((k-1)/2)]
class Solution2:
def getKth(self,A,B,k):
lenA = len(A);lenB = len(B)
if lenA > lenB: return self.getKth(B,A,k)
if lenA == 0: return B[k-1]
if k == 1: return min(A[0],B[0])
pa = min(k//2,lenA);pb = k - pa
if A[pa-1] <= B[pb-1]:
return self.getKth(A[pa:],B,pb)
else:
return self.getKth(A,B[pb:],pa)
def findMedianSortedArrays(self,A,B):
lenA = len(A);lenB = len(B)
if (lenA + lenB) % 2 == 1:
print(self.getKth(A,B,(lenA+lenB)//2 + 1))
return self.getKth(A,B,(lenA+lenB)//2 + 1)
else:
print((self.getKth(A,B,(lenA+lenB)//2) + self.getKth(A,B,(lenA+lenB)//2+1))*0.5)
return (self.getKth(A,B,(lenA+lenB)//2) + self.getKth(A,B,(lenA+lenB)//2+1))*0.5
if __name__ == \'__main__\': num1 = [1,2,8] num2 = [4,5,6,7,10] ss =Solution0() ss.findMedianSortedArrays(num1,num2)
参考博客:https://blog.csdn.net/suibianshen2012/article/details/51842597 https://www.cnblogs.com/zuoyuan/p/3759682.html http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/
以上是关于LeetCode Hard: 4. Median of Two Sorted Arrays的主要内容,如果未能解决你的问题,请参考以下文章
(Leetcode) Median of Two Sorted Arrays (Hard)
Leetcode Array 4 Median of Two Sorted Arrays
[AGC06D] Median Pyramid Hard (玄学)