题目:

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
```

1.最简单的方法,并归然后取中位数,O(m+n),想不到其他方法就硬着头皮试试,不知道为啥leetcode居然给过了。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n1=nums1.size(),n2=nums2.size(),i1=0,i2=0,n=n1+n2;
        vector<int> nums;
        while(i1<n1 && i2<n2)
            if(nums1[i1]<nums2[i2])
                nums.push_back(nums1[i1++]);
            else
                nums.push_back(nums2[i2++]);
        while(i1<n1)
            nums.push_back(nums1[i1++]);
        while(i2<n2)
            nums.push_back(nums2[i2++]);
        if(n%2)
            return nums[n/2];
        else
            return (double)(nums[n/2]+nums[n/2-1])/2;	
    }
};

2.递归分治法 O(log(m+n)),将问题转化为求两个有序数组第k个元素。
不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素。
取A[k/2] B[k/2] 比较,假设 A[k/2] > B[k/2] ,那么,所求的元素必然不在B的前k/2个元素中(证明反证法)。
于是我们可以将B的前k/2元素删去,求剩下两个数列的k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。

//nums1的i1位置开始, nums2的i2位置开始,找第k个数 
double find_kth(vector<int>& nums1, vector<int>& nums2,int i1,int i2,int k){
	if(i1>=nums1.size())
		return nums2[i2+k-1];
	if(i2>=nums2.size())
		return nums1[i1+k-1];
	if(k==1)
		return nums1[i1]>nums2[i2]?nums2[i2]:nums1[i1];
	int p1=i1+k/2-1>=nums1.size()?INT_MAX:nums1[i1+k/2-1];
	int p2=i2+k/2-1>=nums2.size()?INT_MAX:nums2[i2+k/2-1];
	if(p1<p2)
		return find_kth(nums1,nums2,i1+k/2,i2,k-k/2);
	return find_kth(nums1,nums2,i1,i2+k/2,k-k/2);
}

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
	int n1=nums1.size(),n2=nums2.size(),i1=0,i2=0,n=n1+n2;
	if(n%2)
		return find_kth(nums1,nums2,0,0,n/2+1);
	else{
        cout<<find_kth(nums1,nums2,0,0,n/2)<<" "<<find_kth(nums1,nums2,0,0,n/2+1)<<endl;
        return (find_kth(nums1,nums2,0,0,n/2)+find_kth(nums1,nums2,0,0,n/2+1))/2;
    }		
}