---
# System prepended metadata

title: 'LeetCode #4 [Median of Two Sorted Arrays](https://leetcode.com/problems/median-of-two-sorted-arrays/)'
tags: [Binary Search, LeetCode, Hard]

---

###### tags: `LeetCode` `Binary Search` `Hard`
# LeetCode #4 [Median of Two Sorted Arrays](https://leetcode.com/problems/median-of-two-sorted-arrays/)
### (Hard)


給定兩個大小分別為 m 和 n 的正序（從小到大）數組 nums1 和 nums2。請你找出並返回這兩個正序數組的中位數。

限定時間複雜度為O(log(m+n))。

---

![](https://i.imgur.com/8RDUGob.png)

當總數為奇數時, 中位數為A(m1-1)與B(m2-1)中較大的, 而總數為偶數時, 中位數為兩個數字取平均, 此時左數不變, 而右數為A(m1)與B(m2)中較小者。

因此, 將左值設為0, 右值設為nums1的大小(必須確保nums1個數小於nums2個數), 使用二元搜尋找到合適的m1, 使得nums1[m1]略大於nums2[m2-1]。

---
```
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        
        const int n1=nums1.size(), n2=nums2.size();
        if(n1>n2)return findMedianSortedArrays(nums2, nums1);
        
        int k=(n1+n2+1)/2;
        int l=0, r=n1;
        while(l<r){
            int m1=l+(r-l)/2;
            int m2=k-m1;
            if(nums1[m1]<nums2[m2-1])l=m1+1;
            else r=m1;
        }
        
        const int m1=l, m2=k-l;
        int c1=max(m1<=0?INT_MIN:nums1[m1-1],
                   m2<=0?INT_MIN:nums2[m2-1]);
        if((n1+n2)%2)return c1;
        int c2=min(m1>=n1?INT_MAX:nums1[m1],
                   m2>=n2?INT_MAX:nums2[m2]);
        return (double)(c1+c2)/2;
    }
};
```