LeetCode No.4 Median of Two Sorted Arrays 20170319

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

题目大意:给定两个有序数组,找到两个数组所有数字的中位数。

解题思路:一开始的想法是用两个指针分别指向两个数组的第一个数,比较谁更小,则谁的指针向右移一位,一直计数移到到达(m+n)/2个数的位置。但是仔细看题目后发现时间复杂度有要求,时间复杂度只能为 O(log (m+n))。既然时间复杂度要求只能是log,那么就考虑二分查找的办法。该题类似一个非常经典的求两个有序数组中第k小的数的题目,所以我在此基础上做了一些改进。主函数判断两个数组数字总数如果为奇数则直接返回所有数字中大小处于最中间的数字,如果数字总数为偶数,则返回大小处于中间的两个数字的平均值。核心算法体现于findmedian的递归函数。这题对应于找第k小的数的题目的话k就等于(m+n)/2,用median来保存。先在每个数组中找到第median/2个数,分别设为a、b,如果a小于b,则中位数不可能在第一个数组的前a个数里,那么就把第一个数组前面a个数砍掉,继续进行递归,反之亦然。这里有几个递归停止的条件,比如某个数组没有数了,就直接返回另一个数组中指定位置的数,或者median值为1了就直接返回两个数组中最小的数。如果某个数组剩余数字数量不足median/2,则先在另一个数组上砍掉median/2个数后再继续处理。

class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
n = len(nums1) + len(nums2)
if n % 2 == 1:
return self.findmedian(nums1, nums2, n/2 + 1)
else:
return (self.findmedian(nums1, nums2, n/2) + self.findmedian(nums1, nums2, n/2 + 1))/2.0

def findmedian(self, nums1, nums2, median):
if len(nums1) == 0:
return nums2[median-1]
if len(nums2) == 0:
return nums1[median-1]
if median == 1:
return min(nums1[0], nums2[0])
if len(nums1) >= median/2:
a = nums1[median/2-1]
else:
a = None
if len(nums2) >= median/2:
b = nums2[median/2-1]
else:
b = None
if b is None or (a is not None and a<b):
return self.findmedian(nums1[median/2:], nums2, median-median/2)
else:
return self.findmedian(nums1, nums2[median/2:], median-median/2)

原文地址:https://www.cnblogs.com/fangdai/p/6582057.html