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)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
double result = 0;
int m = int(nums1.size());
int n = int(nums2.size());
if(m<n)
{
swap(nums1,nums2);
swap(m,n);
}
if(n==0)
return m%2?nums1[m/2]:double(nums1[m/2-1]+nums1[m/2])/2;
int imin = 0;
int imax = m;
int i = (imin + imax) / 2;
int j = (m + n + 1) / 2 - i;
while (true) {
if ((i==0||j==n||nums2[j] >= nums1[i - 1])&&
(i==m||j==0||nums2[j - 1] <= nums1[i])) {
int maxLeft,minrignt;
//3*3种情况
// i==0 i==m i!=m
//j==0 × 3 5
//j==n 1 × 6
//j!=n 2 4 7
if(i==0) {
maxLeft = nums2[j - 1];
if (j == n)
minrignt = nums1[i];
else
minrignt = min(nums1[i], nums2[j]);
}
else if(i==m)
{
minrignt=nums2[j];
if(j==0)
maxLeft=nums1[i-1];
else
maxLeft=max(nums1[i-1],nums2[j-1]);
}
else
if(j==0) {
maxLeft = nums1[i - 1];
minrignt = min(nums1[i], nums2[j]);
}
else if(j==n) {
maxLeft=max(nums1[i-1],nums2[j-1]);
minrignt=nums1[i];
} else {
minrignt = min(nums1[i], nums2[j]);
maxLeft = max(nums1[i - 1], nums2[j - 1]);
}
if((m+n)%2==0)
result=double(maxLeft+minrignt)/2;
else
result=maxLeft;
break;
}
if (nums2[j - 1] > nums1[i]) {
i++;
j--;
continue;;
}
if (nums1[i - 1] > nums2[j]) {
i--;
j++;
continue;
}
}
return result;
}
};
int main(){
Solution A;
vector<int> s1{4};
vector<int> s2{1,2,3,5,6};
double result=A.findMedianSortedArrays(s1,s2);
cout<<" "<<result<<endl;