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
