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

【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 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值