1、题目描述
给定两个大小为 m 和 n 的有序数组 nums1
和 nums2
。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
2、题解
2.1、解法一
原理:将nums1和nums2按照由小到大的顺序合并到nums数组中
算法的时间复杂度: O(m)或O(n)
class Solution:
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
l1 = len(nums1)
l2 = len(nums2)
print(nums1,nums2)
nums = []
if l1 and l2:
if nums1[l1-1] <= nums2[0]:
nums.extend(nums1)
nums.extend(nums2)
elif nums2[l2-1] <= nums1[0]:
nums.extend(nums2)
nums.extend(nums1)
else:
index1 = 0
index2 = 0
while True:
if index1+1 > l1:
nums.extend(nums2[index2:])
break
if index2+1 > l2:
nums.extend(nums1[index1:])
break
if nums1[index1] <= nums2[index2]:
nums.append(nums1[index1])
index1 += 1
else:
nums.append(nums2[index2])
index2 += 1
elif l1>0 and l2 == 0:
nums = nums1
elif l1 == 0 and l2 >0:
nums = nums2
print(nums)
l3 = len(nums)
if l3% 2 == 1:
mid = int(l3/2)
ret = nums[mid]
else:
mid = int(l3/2 -1)
ret = (nums[mid] + nums[mid+1])/2
return ret
2.2、解法二
原理:将nums1和nums2合并后排序,然后求中位数
算法的时间复杂度: O(m+(m+n)log(m+n))
class Solution:
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
nums = nums1.extend(nums2)
s = sorted(nums)
if len(s) %2 == 1:
ret = s[int(len(s)/2)]
else:
mid = int(len(s)/2 -1)
ret = (s[mid] + s[mid+1])/2
return ret