https://leetcode.com/problems/median-of-two-sorted-arrays/description/
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)).
nums1 = [1, 3] nums2 = [2] The median is 2.0
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
The hardest thing of this problem is to consider every border case. A good thought to solve this problem is dividing the two array into two equal-length parts, and let max_of_left <= min_of_right, then median = (max_of_left + min_of_right) / 2.
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
len1 = len(nums1)
len2 = len(nums2)
if len1 > len2:
return self.findMedianSortedArrays(nums2, nums1)
mid = (len1 + len2 + 1) / 2
left = 0
right = len1
while left <= right:
index1 = (left + right) / 2
index2 = mid - index1
if index1 < len1 and nums1[index1] < nums2[index2 - 1]:
left = index1 + 1
elif index1 > 0 and nums1[index1 - 1] > nums2[index2]:
right = index1 - 1
else:
if index1 == 0:
max_of_left = nums2[index2 - 1]
elif index2 == 0:
max_of_left = nums1[index1 - 1]
else:
max_of_left = max(nums1[index1 - 1], nums2[index2 - 1])
if (len1 + len2) % 2 == 1:
return max_of_left
if index1 == len1:
min_of_right = nums2[index2]
elif index2 == len2:
min_of_right = nums1[index1]
else:
min_of_right = min(nums1[index1], nums2[index2])
return float(max_of_left + min_of_right) / 2