【LeetCode & 剑指offer刷题】查找与排序题4:Median of Two Sorted Arrays

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

Median of Two Sorted Arrays

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)).
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

C++
 
//方法一:合并,然后计算中值
//不过时间复杂度为O(m+n),不满足题意
class Solution
{
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
    {
        int i=0,j=0,k=0;
        int m = nums1.size();
        int n = nums2.size();
        int len = m+n;
        vector<int> temp(len);
        while(i<m&&j<n) //合并,耗时O(m+n)
        {
            temp[k++] = (nums1[i]<nums2[j])? nums1[i++]:nums2[j++];
        }
        while(i<m)
        {
            temp[k++] = nums1[i++];
        }
        while(j<n)
        {
            temp[k++] = nums2[j++];
        }
      
        double mid; //注意这里类型为浮点数,因为可能为小数
        if(len&1)
            mid = temp[(len-1)/2];//长度为奇数时,中值为中间数
        else
            mid = (temp[(len-1)/2]+temp[len/2])/2.0;//长度为偶数时,中值为中间两数平均数
        return mid;
      
      
    }
};
 
//方法二:递归,利用二分查找
//没看懂??
class Solution
{
public:
    int getkth(vector<int>& s, int m, vector<int>& l, int n, int k)
    {
        //让m<=n
        if(m>n) return getkth(l,n,s,m,k);
        if(m==0) return l[k-1];
        if(k == 1) return min(s[0], l[0]);
       
        int i = min(m, k/2),j = min(n,k/2);
        if(s[i-1] > l[j-1]) return getkth(s,m,, n-j, k-j);
        else return getkth(s+i, m-i, l, n, k-i);
        return 0;
    }
       
    double findMedianSortedArrays(vector<int>& a, vector<int>& b)
    {
        int m = a.size();
        int n = b.size();
        int l = (m+n+1) >> 1;
        int r = (m+n+2) >> 1;
        return (getkth(a,m,b,n,l) + getkth(a,m,b,n,r))/2.0;
              
    }
};
 
 
 

 

posted @ 2019-01-05 20:08  wikiwen  阅读(173)  评论(0编辑  收藏  举报