# 4-median-of-two-sorted-arrays Try it on leetcode ## Description

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

The overall run time complexity should be O(log (m+n)).

 

Example 1:

Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.

Example 2:

Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.

 

Constraints:

## Solution(Python) ```Python class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: return self.OptmialbinarySeach(nums1, nums2) # Time Complexity: O(m+n) # Space Complexity: O(m+n) def bruteforce(self, nums1: List[int], nums2: List[int]) -> float: n = len(nums1) m = len(nums2) nums1 = nums1[:] + [0] * m i = n - 1 j = m - 1 k = m + n - 1 while i >= 0 and j >= 0: if nums1[i] > nums2[j]: nums1[k] = nums1[i] i -= 1 k -= 1 else: nums1[k] = nums2[j] j -= 1 k -= 1 while j >= 0: nums1[k] = nums2[j] j -= 1 k -= 1 l = m + n mid = l // 2 print(nums1) if l % 2 == 0: return (nums1[mid] + nums1[mid - 1]) / 2 else: return nums1[mid] # Time Complexity: O(log(m+n)) def binarySeach(self, A, B): l = len(A) + len(B) if l % 2 == 1: return self.kth(A, B, l // 2) else: return (self.kth(A, B, l // 2) + self.kth(A, B, l // 2 - 1)) / 2.0 def kth(self, a, b, k): if not a: return b[k] if not b: return a[k] ia, ib = len(a) // 2, len(b) // 2 ma, mb = a[ia], b[ib] # when k is bigger than the sum of a and b's median indices if ia + ib < k: # if a's median is bigger than b's, b's first half doesn't include k if ma > mb: return self.kth(a, b[ib + 1:], k - ib - 1) else: return self.kth(a[ia + 1:], b, k - ia - 1) # when k is smaller than the sum of a and b's indices else: # if a's median is bigger than b's, a's second half doesn't include k if ma > mb: return self.kth(a[:ia], b, k) else: return self.kth(a, b[:ib], k) # Time Complexity: O(min(log(m),log(n)))) def OptmialbinarySeach(self, A, B): l = len(A) + len(B) if l % 2 == 1: return self.kth(A, B, l // 2) else: return (self.kth(A, B, l // 2) + self.kth(A, B, l // 2 - 1)) / 2.0 def kth(self, a, b, k): if not a: return b[k] if not b: return a[k] ia, ib = len(a) // 2, len(b) // 2 ma, mb = a[ia], b[ib] # when k is bigger than the sum of a and b's median indices if ia + ib < k: # if a's median is bigger than b's, b's first half doesn't include k if ma > mb: return self.kth(a, b[ib + 1:], k - ib - 1) else: return self.kth(a[ia + 1:], b, k - ia - 1) # when k is smaller than the sum of a and b's indices else: # if a's median is bigger than b's, a's second half doesn't include k if ma > mb: return self.kth(a[:ia], b, k) else: return self.kth(a, b[:ib], k) ```