题目描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
解题思路:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
idx, jdx = 0, 0
nums3 = []
while (idx < len(nums1) and jdx < len(nums2)):
if nums1[idx] <= nums2[jdx]:
nums3.append(nums1[idx])
idx = idx + 1
else:
nums3.append(nums2[jdx])
jdx = jdx + 1
if idx == len(nums1) and jdx < len(nums2):
while(jdx < len(nums2)):
nums3.append(nums2[jdx])
jdx = jdx + 1
if jdx == len(nums2) and idx < len(nums1):
while(idx < len(nums1)):
nums3.append(nums1[idx])
idx = idx + 1
if len(nums3) % 2 == 1:
return float(nums3[len(nums3) / 2])
else:
return float(nums3[len(nums3) / 2] + nums3[len(nums3) / 2 - 1]) / 2.0
算法性能:
但是算法的时间复杂度为 o ( m + n ) o(m+n) o(m+n),而题目要求是时间复杂度 o ( l o g ( m + n ) ) o(log(m+n)) o(log(m+n)),因此考虑用二分查找:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
if (len(nums1) + len(nums2)) % 2 == 1:
return float(self.findMaxK(nums1, nums2, (len(nums1) + len(nums2)) / 2 + 1))
else:
return float((self.findMaxK(nums1, nums2, (len(nums1) + len(nums2)) / 2 ) + self.findMaxK(nums1, nums2, (len(nums1) + len(nums2)) / 2 + 1)) / 2.0)
def findMaxK(self, nums1, nums2, k):
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
if len(nums1) == 0:
return nums2[k - 1]
if k == 1:
if nums1[0] < nums2[0]:
return nums1[0]
else:
return nums2[0]
idx = min(k/2 - 1, len(nums1) - 1)
if nums1[idx] <= nums2[k - idx - 2]:
return self.findMaxK(nums1[idx + 1 :], nums2, k - idx - 1)
else:
return self.findMaxK(nums1, nums2[k - idx - 1 :], idx + 1)