要求: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. 【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 ...

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

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

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

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

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

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

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

  8. LeetCode-4. 两个排序数组的中位数(详解)

    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...

  9. JavaScript实现获取两个排序数组的中位数算法示例

    本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...

随机推荐

  1. Java学习笔记15

    do-while循环时while循环的变体语法如下:do{  // 循环体 语句(组);}while(循环继续条件); 如果循环中的语句至少需要执行一次,那么建议使用do-while循环. for循环 ...

  2. javascript平时例子⑩(表情发送)

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  3. 黄聪:远程序桌面登录的.NET(C#)开发

    MSTSCLib.dll和MsTscAxWrapper.dll下载:LibDll.rar 远程序桌面登录的.NET开发,可以使用MSTSCLib.dll和MsTscAxWrapper.dll两个转换过 ...

  4. iOS开发之 UIScrollView的frame、contentSize、contentOffset和contentInset属性

    ios中下拉图片变大效果 http://blog.csdn.net/mad2man/article/details/14169197 IOS中UIScrollView的frame.contentSiz ...

  5. Oracle数据库——触发器的创建与应用

    一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...

  6. We Recommend a Singular Value Decomposition

    We Recommend a Singular Value Decomposition Introduction The topic of this article, the singular val ...

  7. perl杂项

    perl -pi -e 's|googleapis.com|useso.com|g' `find ./ -type f` yingc@yingc:~/gcyin/test/thirdparty/ffm ...

  8. 关于.net那点事儿

    .NET是什么? .NET是开发“托管”软件的平台. 传统环境和.NET环境区别: 传统环境——先将源代码编译为包含机器代码的可执行文件,然后由操作系统加载和执行可执行文件. .NET环境——编译器首 ...

  9. SpringMVC06以对象的方式获取前台的数据

    ========创建需要的两个实体类================ public class School { private String sName; private String addres ...

  10. Halcon的应用程序 打开后 弹出没有帮助文件错误提示

    问题: Halcon的应用程序 打开后 弹出没有帮助文件错误提示 解决方法: 建立(C:\ProgramFiles\MVTec\halcon)目录,将halcon安装目录下的help文件夹复制过来即可 ...