LeetCode 线性表的操作(Median of Two Sorted Arrays )

        

        1.Median of Two Sorted Arrays



        原文链接:点击这里进入


        基本内容:

        There are two sorted arrays A and B 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)).

        解题思想:

        o(m + n)的解法比较直观,直接合并两个数组,并且求第k大的元素。  如果是找到第k大的元素,我们只需要设置两个指针 pA与pB,分别指向数组A 和数组B,如果数组A单前元素小,则pA++,如果数组B当前元素小pB++  同时设置一个元素记录前进个个数m,当这个前进个数m = k 的时候,就可以找到了。

        中位数:

        当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。(注意:中位数和众数不同,众数指最多的数,众数有时不止一个,而中位数只能有一个。


        了解了中位数的概念,我们需要分情况讨论,当m+n 是奇数或者是偶数的情况。
        
        继续刚才的时间复杂度的讨论,题目要求时间复杂度是o(m + n),且根据两个数组都是已经排序好的,我们可以可以想到使用二分查找类似的方法。  o(m+n)的方法中,我们是每比较一次,指针加1,这样需要比较k次,才能得出结果。那么如果我们每次都可以比较k的一半呢。

        假设A和数组B的元素个数都大于k/2个, 我们将A[ k/2-1]与B[k/2-1]的值进行比较,会出现以下3种情况,
  •     A[ k/2-1] == B[k/2-1],则我们恰好可以确定合并数组之后前k个值,
  •     A[ k/2-1] > B[k/2-1], 那么我们首先可以确定B[0] 到B[k/2 -1]这其中k/2个值一定是合并数组中中的k个值,也就是说合并数组前k位中一定会包含这k/2个值
  •     A[ k/2-1] < B[k/2-1], 同上分析 A[0] 到A[k/2 -1]中的值一定会在合并数组中前k位中。

        因此我们可以实现一个递归函数,来完成这个功能。

        代码:

        
 double findMedianSortedArrays(int A[], int m, int B[], int n) {
        int half =  m + n;
        if( half & 0x1 )
            return FindKthNumberInArrays( A, m, B, n,  ( half + 1 ) / 2 );
        else
        {
            double result = ( FindKthNumberInArrays( A, m, B, n, half / 2 ) +
                    FindKthNumberInArrays( A, m, B, n, half / 2 + 1 ) );
            return result / 2.0 ;
        }
    }
    int FindKthNumberInArrays( int A[], int m, int B[], int n, int k )
    {
            if( m > n )
                return FindKthNumberInArrays( B, n, A, m, k );
            if( m == 0 )
                return B[ k - 1 ];
            int pa,pb;
        
            while( k )
            {
        
                if( k == 1 )
                    return min( A[ 0 ], B[ 0 ] );
                else
                {
                    pa = min( m, k / 2 );
                    pb = k - pa;
                    if( A[ pa - 1 ] == B[ pb - 1 ] )
                        return A[ pa - 1];
                    else if ( A[ pa - 1 ] > B[ pb - 1 ] )
                    {
                        B = B + pb;
                        k = k - pb;
                    }
                    else
                    {
                        A = A + pa;
                        k = k - pa;
                    }
                }
            }
            return 0;
      }

        

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值