当前位置: 首页 > news >正文

2.Median of Two Sorted Arrays (两个排序数组的中位数)

要求: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 时) 步,找出中位数。

代码如下: 

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 4         if(m == 0) return findMediaArray(B, n);
 5         if(n == 0) return findMediaArray(A, m);
 6         unsigned id1, id2;
 7         id1 = id2 = 0;
 8         if((m + n) & 0x1)
 9         {
10             unsigned med = 0;
11             while(id1 < m && id2 < n)
12             {
13                 while(id1 < m && id2 < n && A[id1] <= B[id2]) 
14                 {
15                     ++id1;
16                     ++med;
17                     if(med == (m + n + 1) >> 1) return (double)A[id1 - 1];
18                 }
19                 while(id1 < m && id2 < n && B[id2] <= A[id1])
20                 {
21                     ++id2;
22                     ++med;
23                     if(med == (m + n + 1) >> 1) return (double)B[id2 - 1];
24                 }
25             }
26             while(id2 < n)
27             {
28                 ++med;
29                 if(med == (m + n + 1) >> 1) return (double)B[id2];
30                 ++id2;
31             }
32             while(id1 < m)
33             {
34                 ++med;
35                 if(med == (m + n + 1) >> 1) return (double)A[id1];
36                 ++id1;
37             }
38         }
39         else
40         {
41             unsigned cnt = 0;
42             int med1 = 0, med2 = 0;
43             while(id1 < m && id2 < n)
44             {
45                 while(id1 < m && id2 < n && A[id1] <= B[id2]) 
46                 {
47                     ++id1;
48                     ++cnt;
49                     if(cnt == (m + n) >> 1) med1 = A[id1 - 1];
50                     if(cnt == ((m + n) >> 1) + 1)
51                     {
52                         med2 = A[id1 - 1];
53                         return ((double)med1 +(double)med2) / 2;
54                     }
55                 }
56                 while(id1 < m && id2 < n && B[id2] <= A[id1])
57                 {
58                     ++id2;
59                     ++cnt;
60                     if(cnt == ((m + n) >> 1)) med1 = B[id2 - 1];
61                     if(cnt == ((m + n) >> 1) + 1)
62                     {
63                         med2 = B[id2 - 1];
64                         return ((double)med1 +(double)med2) / 2;
65                     }
66                 }
67             }
68             while(id2 < n)
69             {
70                 ++cnt; 
71                 if(cnt == (m + n) >> 1) med1 = B[id2];
72                 if(cnt == ((m + n) >> 1) + 1)
73                 {
74                     med2 = B[id2];
75                     return ((double)med1 +(double)med2) / 2;
76                 }
77                 ++id2;
78             }
79             while(id1 < m)
80             {
81                 ++cnt; 
82                 if(cnt == (m + n) >> 1) med1 = A[id1];
83                 if(cnt == ((m + n) >> 1) + 1)
84                 {
85                     med2 = A[id1];
86                     return ((double)med1 +(double)med2) / 2;
87                 }
88                 ++id1;
89             }
90         }
91     }
92     double findMediaArray(int A[], int m){
93         if(m == 0) return 0.0;
94         if(m & 0x1) return (double)A[(m - 1) >> 1];
95         else return ((double)A[m >> 1] + (double)A[(m >> 1) - 1]) / 2;
96     }
97     
98 };
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;
        }
    }
};

 

 

 

 

 

转载于:https://www.cnblogs.com/liyangguang1988/p/3617862.html

相关文章:

  • 轻量级kotlin + Mvp + Rxjava + Retrofit框架
  • HDU 2722 Here We Go(relians) Again
  • yii2-queue一个好用的yii2队列操作扩展
  • ppwjs之bootstrap表格:响应式
  • [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架
  • Java大小写转换
  • Transact-SQL语法速查手册
  • 开源地图数据可视化库——mapnik
  • IOS开发常用的linux命令
  • grep/字符/次数匹配/锚定符/小大括号/wc/tr/cut/sort/uniq
  • ajax跨域问题
  • 菜根谭#89
  • Kubernetes上的十大应用程序
  • 开发技巧:高效的使用 Response.Redirect
  • 正则表达式-基础知识Review
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • docker python 配置
  • mysql innodb 索引使用指南
  • PAT A1017 优先队列
  • vue.js框架原理浅析
  • 产品三维模型在线预览
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前端面试之CSS3新特性
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 网络应用优化——时延与带宽
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 怎么把视频里的音乐提取出来
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #1014 : Trie树
  • #13 yum、编译安装与sed命令的使用
  • #define与typedef区别
  • #includecmath
  • #Linux(make工具和makefile文件以及makefile语法)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (备忘)Java Map 遍历
  • (分布式缓存)Redis哨兵
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (过滤器)Filter和(监听器)listener
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转) Android中ViewStub组件使用
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net FrameWork简介,数组,枚举
  • .NET 解决重复提交问题
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET实现之(自动更新)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ 转载 ] SharePoint 资料
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Android]Android开发入门之HelloWorld
  • [bzoj1901]: Zju2112 Dynamic Rankings