要求: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) {
if(m == ) return findMediaArray(B, n);
if(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;
if(med == (m + n + ) >> ) return (double)A[id1 - ];
}
while(id1 < m && id2 < n && B[id2] <= A[id1])
{
++id2;
++med;
if(med == (m + n + ) >> ) return (double)B[id2 - ];
}
}
while(id2 < n)
{
++med;
if(med == (m + n + ) >> ) return (double)B[id2];
++id2;
}
while(id1 < m)
{
++med;
if(med == (m + n + ) >> ) return (double)A[id1];
++id1;
}
}
else
{
unsigned cnt = ;
int med1 = , med2 = ;
while(id1 < m && id2 < n)
{
while(id1 < m && id2 < n && A[id1] <= B[id2])
{
++id1;
++cnt;
if(cnt == (m + n) >> ) med1 = A[id1 - ];
if(cnt == ((m + n) >> ) + )
{
med2 = A[id1 - ];
return ((double)med1 +(double)med2) / ;
}
}
while(id1 < m && id2 < n && B[id2] <= A[id1])
{
++id2;
++cnt;
if(cnt == ((m + n) >> )) med1 = B[id2 - ];
if(cnt == ((m + n) >> ) + )
{
med2 = B[id2 - ];
return ((double)med1 +(double)med2) / ;
}
}
}
while(id2 < n)
{
++cnt;
if(cnt == (m + n) >> ) med1 = B[id2];
if(cnt == ((m + n) >> ) + )
{
med2 = B[id2];
return ((double)med1 +(double)med2) / ;
}
++id2;
}
while(id1 < m)
{
++cnt;
if(cnt == (m + n) >> ) med1 = A[id1];
if(cnt == ((m + n) >> ) + )
{
med2 = A[id1];
return ((double)med1 +(double)med2) / ;
}
++id1;
}
}
}
double findMediaArray(int A[], int m){
if(m == ) return 0.0;
if(m & 0x1) return (double)A[(m - ) >> ];
else return ((double)A[m >> ] + (double)A[(m >> ) - ]) / ;
} };

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. Leetcode4.Median of Two Sorted Arrays两个排序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...

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

  3. [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 two ...

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

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

  6. 【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 ...

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

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

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

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

随机推荐

  1. Linux在目录中查找某个函数

    1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...

  2. <我是一只IT小小鸟>读书笔记

    这篇文章给我感触最深的是开篇蒋宇东所出的一道选择题--今后的发展选择有三条:A.做一辈子IT民工:B.将大学时欠下来的债补上:C.改行. 他们用自己的成长故事告诉师弟师妹们:一定要弄清楚上大学首要的任 ...

  3. 使用Ueditor的心得。

    现在有一个项目,需要富文本插件,以前用的都是国外的CKEditor,后来百度推出了自己的富文本编辑插件Ueditor,试用了一下,感觉不错. 遂决定在新项目中使用该插件. 在使用Ueditor上传图片 ...

  4. UML学习笔记1

    UML概述:是一种为面向对象软件设计提供的建模语言. 构成:事物things关系relationshs图diagrams UML事物:构件事物 行为事物 分组事物 注释事物 UML关系:依赖depen ...

  5. RabbitMQ/JAVA (路由选择)

    上篇博文中,我们建立了一个简单的日志系统.可以广播消息给多个消费者.本篇博文,我们将添加新的特性--我们可以只订阅部分消息.比如:我们可以接收Error级别的消息写入文件.同时仍然可以在控制台打印所有 ...

  6. 从零开始学习Node.js例子四 多页面实现数学运算 续一(使用connect和express框架)

    1.使用connect框架 .use方法用于绑定中间件到connect服务器,它会配置一系列在接到请求时调用的中间件模块,此例中我们要配置的中间件有favicon logger static rout ...

  7. [GodLove]Wine93 Tarining Round #2

    比赛链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=44704#overview 题目来源: ZOJ Monthly, June 2 ...

  8. 对于unallocated space的翻译 我想说几句话

    在sqlserver中,当我们使用sp_spaceused查看数据库空间使用情况的时候 会看到属性unallocated space.所有的中文翻译都是“未保留供数据库对象使用的数据库空间”, 作为中 ...

  9. python ML 笔记:Kmeans

    kmeans算法的python实现: 参考与样本来源<Machine Learning in Action> #-*-coding:UTF-8-*- ''' Created on 2015 ...

  10. Xerces链接错误原因之/Zc:wchar_t-设置不一致

    今天程序需要使用Xerces作为xml文件的解析与序列化工具,使用的是Xerces2.7.0版本.具体编译教程如下: 成功编译出了Xerces.dll和Xerces.lib.但是在链接到主工程的时候, ...