给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0] 输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1] 输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = [] 输出:2.00000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
类似于归并两个有序数组,但是不会开辟一个长度为 m + n 的数组保存每个元素,而是只保存遍历到的最后两个元素,当遍历到数组的中间位置时,停止遍历,然后计算中位数,返回。
需要注意:当两个数组的长度之和为奇数时,中位数是中间的那个元素,否则是中间的两个元素的平均数。
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
if not nums1 and not nums2:
return 0.
i = j = 0
cur_index = 0
total_length = len(nums1) + len(nums2)
end = total_length / 2
prev_element = mid_element = None
while i < len(nums1) and j < len(nums2):
prev_element = mid_element
if nums1[i] <= nums2[j]:
mid_element = nums1[i]
i = i + 1
else:
mid_element = nums2[j]
j = j + 1
if cur_index == end:
if total_length % 2:
return mid_element / 1.0
return (prev_element + mid_element) / 2.0
cur_index = cur_index + 1
remaining, index = (nums2, j) if i >= len(nums1) else (nums1, i)
while index < len(remaining):
prev_element = mid_element
mid_element = remaining[index]
index = index + 1
if cur_index == end:
if total_length % 2:
return mid_element / 1.0
return (prev_element + mid_element) / 2.0
cur_index = cur_index + 1