要求:Median of Two Sorted Arrays (求两个排序数组的中位数)

分析:1. 两个数组含有的数字总数为偶数奇数两种情况。2. 有数组可能为

解决方法:

1.排序法

时间复杂度O(m+n),空间复杂度 O(m+n)

归并排序到一个新的数组,求出中位数。

代码:

class Solution {
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        int *C = new int[m+n];
        int id1, id2, id3;
        id1 = id2 = id3 = 0;
        while(id1 < m && id2 < n) {
            while(id1 < m && id2 < n && A[id1] <= B[id2]) C[id3++] = A[id1++];
            while(id1 < m && id2 < n && B[id2] <= A[id1]) C[id3++] = B[id2++];
        }
        while(id1 < m) C[id3++] = A[id1++];
        while(id2 < n) C[id3++] = B[id2++];
        if(id3 & 0x1) {
            id1 = C[id3>>1];
            delete[] C;
            return (double)id1;
        }
        else {
            id1 = C[id3>>1];
            id2 = C[(id3>>1)-1];
            delete[] C;
            return ((double)id1 + (double)id2) / 2.0;
        }
    }
};

2.使用两个指针查找

时间复杂度O((m+n)/2),空间复杂度O(1)

数组 A ,B 分别使用一个指针,都从头或者从尾部开始走 (m+n) /2(m+n & 0x ==1 时) 步,找出中位数。

代码如下:

 class Solution {
 public:
     double findMedianSortedArrays(int A[], int m, int B[], int n) {
         ) return findMediaArray(B, n);
         ) return findMediaArray(A, m);
         unsigned id1, id2;
         id1 = id2 = ;
         if((m + n) & 0x1)
         {
             unsigned med = ;
             while(id1 < m && id2 < n)
             {
                 while(id1 < m && id2 < n && A[id1] <= B[id2])
                 {
                     ++id1;
                     ++med;
                     ) >> ) ];
                 }
                 while(id1 < m && id2 < n && B[id2] <= A[id1])
                 {
                     ++id2;
                     ++med;
                     ) >> ) ];
                 }
             }
             while(id2 < n)
             {
                 ++med;
                 ) >> ) return (double)B[id2];
                 ++id2;
             }
             while(id1 < m)
             {
                 ++med;
                 ) >> ) return (double)A[id1];
                 ++id1;
             }
         }
         else
         {
             unsigned cnt = ;
             , med2 = ;
             while(id1 < m && id2 < n)
             {
                 while(id1 < m && id2 < n && A[id1] <= B[id2])
                 {
                     ++id1;
                     ++cnt;
                     ) med1 = A[id1 - ];
                     ) + )
                     {
                         med2 = A[id1 - ];
                         ;
                     }
                 }
                 while(id1 < m && id2 < n && B[id2] <= A[id1])
                 {
                     ++id2;
                     ++cnt;
                     )) med1 = B[id2 - ];
                     ) + )
                     {
                         med2 = B[id2 - ];
                         ;
                     }
                 }
             }
             while(id2 < n)
             {
                 ++cnt;
                 ) med1 = B[id2];
                 ) + )
                 {
                     med2 = B[id2];
                     ;
                 }
                 ++id2;
             }
             while(id1 < m)
             {
                 ++cnt;
                 ) med1 = A[id1];
                 ) + )
                 {
                     med2 = A[id1];
                     ;
                 }
                 ++id1;
             }
         }
     }
     double findMediaArray(int A[], int m){
         ) return 0.0;
         ) >> ];
         ] + () - ]) / ;
     }

 };

code

3.类二分查找
时间复杂度O(lg((m+n)/2)) ~ O(lg(m+n)),空间复杂度O(1)

将问题化解为:查找两个数组中从小到大第 K 个元素。(从大到小亦可)以下为求解过程:

步骤:假定数组 A 中元素个数 m 小于数组 B 中元素个数 n 。从数组A中取出第 min(K/2,m)=pa 个元素,从数组B中取出第 K-pa = pb 个元素,若:

a. A[pa] < B[pb],则将问题化为取数组 A+pa,与数组 B 中第 K - pb 个元素。

b. A[pa] = B[pb], 则第 k 个元素就是 A[pa] 或者 B[pb]。

c. A[pa] > B[pb],则将问题化为取数组 A,与数组 B+pb 中第 K - pa 个元素。

代码:

double findKth(int A[], int m, int B[], int n, int k){
    if(m > n) return findKth(B, n, A, m, k);
    if(m == 0) return B[k-1];
    if(k == 1) return min(A[0], B[0]);
    int pa = min(k / 2, m), pb = k - pa;
    if(A[pa - 1] < B[pb - 1]){
        return findKth(A + pa, m - pa, B, n, k - pa);
    }else if(A[pa - 1] > B[pb - 1]){
        return findKth(A, m, B + pb, n - pb, k - pb);
    }else{
        return A[pa - 1];
    }

    }
class Solution {
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        int total = m + n;
        if(total == 0) return 0.0;
        if(total & 0x1){
            return findKth(A, m, B, n, (total + 1) >> 1);
        }else{
            return (findKth(A, m, B, n, total >> 1) + findKth(A, m, B, n, (total >> 1) + 1)) / 2.0;
        }
    }
};

2.Median of Two Sorted Arrays (两个排序数组的中位数)的更多相关文章

  1. [LeetCode] 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 ...

  2. [LintCode] 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 ...

  3. 004 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 ...

  4. 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  5. 【LeetCode】4.Median of Two Sorted Arrays 两个有序数组中位数

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  6. 4. Median of Two Sorted Arrays(2个有序数组的中位数)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  7. Median of Two Sorted 求两个有序数组的中位数

    中位数是把一个数的集合划分为两部分,每部分包含的数字个数相同,并且一个集合中的元素均大于另一个集合中的元素. 因此,我们考虑在一个任意的位置,将数组A划分成两部分.i表示划分数组A的位置,如果数组A包 ...

  8. LeetCode4. 两个排序数组的中位数

    4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...

  9. LeetCode(4):两个排序数组的中位数

    Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...

随机推荐

  1. PHP中的数据库三、redis

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  2. 如何解决oracle数据库过期的情况

    之前用的数据库都是开源的,在另一台电脑上安装的时候,居然有时间限制,只能用30天.安装了好多次都是这样,就这样,三十天一破解.破解方法如下: 不管是快要过期了还是已经过期了,都可以用这个方法. 1.在 ...

  3. yii过滤器的原理和使用

    过滤器官方页面:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller 过滤器是一段代码,可被配置在控制器动作执行之前或之后 ...

  4. 寻找研究基于NS2研究覆盖网络的小伙伴:)

    如题,本人菜鸟刚刚入门,想找些基于NS2研究覆盖网络方面的小伙伴,具体点是关于覆盖网络中QoS服务调度方法方面的,有的小伙伴可以留下联系方式,或者加我QQ:245939069  :P:P:P

  5. [ACM_模拟] ACM - Draw Something Cheat [n个长12的大写字母串,找出交集,按字母序输出]

    Description Have you played Draw Something? It's currently one of the hottest social drawing games o ...

  6. [STL]heap和priority_queue

    一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap.heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全 ...

  7. UVa 11300 Spreading the Wealth 分金币

    圆桌旁坐着 n 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...

  8. 将excel数据导入内表的函数

    call function 'TEXT_CONVERT_XLS_TO_SAP'    exporting      i_tab_raw_data       = lt_raw "开始行    ...

  9. Javascript的模块化编程

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  10. UVA 562 Dividing coins(dp + 01背包)

    Dividing coins It's commonly known that the Dutch have invented copper-wire. Two Dutch men were figh ...