---
# System prepended metadata

title: 4. Median of Two Sorted Arrays
tags: [Leetcode, binary search, python, Top 100 Liked Questions, hard]

---

###### tags: `Leetcode` `hard` `binary search` `python` `Top 100 Liked Questions`

# 4. Median of Two Sorted Arrays

## [題目來源:] https://leetcode.com/problems/median-of-two-sorted-arrays/

## 題目:
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)).**

## 解題想法:
* 要long(m+n): 往二分法去思考
* 因為最終要return找排好的中位數mid 
ex: n=[1,3] m=[2] -> mid=2
ex: n=[1,3] m=[2,4] ->mid=(2+3)/2= 2.5
* 技巧!! 對於奇偶數均適用:
找(m+n+1)/2、(m+n+2)/2 取和平均

#### [高手完整解析] #https://github.com/grandyang/leetcode/issues/4

## Python:
``` python=
class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        #技巧:對奇偶均適用:找(m+n+1)/2 (m+n+2)/2 取和平均
        m = len(nums1)
        n = len(nums2)
        left = (m + n + 1) // 2
        right = (m + n + 2) // 2
        return float((self.find_k(nums1, 0, nums2, 0, left) + self.find_k(nums1, 0, nums2, 0, right))) / 2
    
    def find_k(self, nums1, i, nums2, j, k): #i為nums1的起始位置  j為nums2的起始位置 
        #找到第k個元素 
        #特殊case
        if i >= len(nums1): #i已超過nums1長度
            return nums2[j + k - 1]
        if j >= len(nums2): #j已超過nums2長度
            return nums1[i + k - 1]
        if k == 1:
            return min(nums1[i], nums2[j])
        
        #對k二分 分別在nums1、nums2中找k/2個元素:
        #目的為要在nums1、nums2中淘汰k/2個較小數字
        if i + k // 2 - 1 < len(nums1):
            midVal1 = nums1[i + k // 2 - 1]
        else:
            #若個數已經太少 不能淘汰 設無限大避免淘汰
            midVal1 = float("inf")
            
        if j + k // 2 - 1 < len(nums2):
            midVal2 = nums2[j + k // 2 - 1]
        else:
            midVal2 = float("inf")
        
        #二分法 比較兩數組第k/2個小的數字minVal1、2
        #若midVal1小 表示要找的數字不在nums1的前k/2個數字
        #可以將其淘汰 遞迴: 將nums1的起始位置向後移動k/2個
        #將k也減去一半
        if midVal1 < midVal2:
            return self.find_k(nums1, i + k // 2, nums2, j, k - k // 2)
        else:
            return self.find_k(nums1, i, nums2, j + k // 2, k - k // 2)
        
result=Solution()
ans=result.findMedianSortedArrays(nums1 = [1,2], nums2 = [3,4])
print(ans)
```

