# 4-Median of Two Sorted Arrays
###### tags: `Hard`
>question : https://leetcode.com/problems/median-of-two-sorted-arrays/
>reference :
https://www.javatpoint.com/cpp-program-to-merge-two-unsorted-arrays
>related problem :
## Solution
- 思路:
1. Merge sort可以讓時間複雜度到O(m+n),即nums1和nums2都逐一比較,較小者放入新陣列中,最後比對完再取中位數
2. 但題目要求O(log(m+n)),所以使用Binary search,將兩個陣列都從中間開始尋找中位數,再依照L1<R2和L2<R1的規則進行修正。nums1和nums2合併且排序的新陣列之中位數前,必定包含分別某些數量來自nums1和nums2,而兩者總和固定,故知道多少來自nums1?即可推得多少來自nums2,各自的中位數也能求得。 *通常nums1是取長度較短的那個陣列,這樣運算之時間複雜度才能較低
3. 看到sorted array就要想到可以使用binary search,或相關的方法。
### ***Merge sort***
```cpp=
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> merged;
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
merged.push_back(nums1[i]);
i++;
} else {
merged.push_back(nums2[j]);
j++;
}
}
while (i < nums1.size()) {
merged.push_back(nums1[i]);
i++;
}
while (j < nums2.size()) {
merged.push_back(nums2[j]);
j++;
}
int mid = merged.size() / 2;
if ((merged.size() % 2) == 0) {
return float(merged[mid - 1] + merged[mid]) / 2;
} else {
return float(merged[mid]);
}
}
};
```
### ***binary search***
```cpp=
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// m n mid=(m+n)/2
int m=nums1.size(),n=nums2.size();
if(m>n) return findMedianSortedArrays(nums2,nums1);
int l=0,r=m,i,j;
int l1,l2,r1,r2;
while(l<=r)
{
i=l+(r-l)/2;
j=(m+n+1)/2-i;
//i>0 && i<m
l1=i?nums1[i-1]:INT_MIN;
l2=j?nums2[j-1]:INT_MIN;
r1=(i!=m)?nums1[i]:INT_MAX;
r2=(j!=n)?nums2[j]:INT_MAX;
if(l1<=r2 && l2<=r1)
break;
else if(l1>r2 && l2<=r1)
r=i-1;
else
l=i+1;
}
if((m+n)&1) return max(l1,l2);
return ((double)max(l1,l2)+(double)min(r1,r2))/2;
}
};
```