Problem: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)).

首先要知道什么是median,也就是我们所知的中位数,处于中间位置的数,很简单,如果长度为奇数,那么中位数就是中间的数,如,1,2,4,那么中位数就是2。如果长度为偶数,那就是中间两个数的均值,如,1,2,3,4,那么中位数就是2.5。

Suool在http://blog.csdn.net/suool/article/details/38343457中提到的第一种方法如下:

合并,排序,找中间位置的值就好:

class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int *a=new int[m+n]; memcpy(a,A,sizeof(int)*m);
memcpy(a+m,B,sizeof(int)*n); sort(a,a+n+m); double median=(double) ((n+m)%? a[(n+m)>>]:(a[(n+m-)>>]+a[(n+m)>>])/2.0); delete a; return median;
}
};

但是我们可以看到中间有个排序sort(a,a+n+m)这个复杂度已经是超过要求了。但是奇怪的是在leetcode上测试居然通过了。

还有一种方法在上述链接中也提到了,就是先在两个数组中找第k个值,然后根据奇数偶数确定k就好。但是该链接上给出的代码是错误了,通过不了。

我找到了原因,把正确的贴出如下:

class Solution
{
private:
double findKth(int a[], int m, int b[], int n, int k)
{ //find kth small
int i = ;
int j = ;
int index = ;
int kth;
if (m == )
return b[k-];
if (n == )
return a[k-];
if (k ==)
return a[]>b[] ? b[] : a[];
while(index <= k && i < m && j < n)
{
if( a[i] >= b[j])
{
index ++;
kth = b[j];
j ++;
}
else
{
index ++;
kth = a[i];
i ++;
}
}
if( index <= k && j == n) // must be <= can't be only <
{
kth = a[i+k-index];
}
if (index <= k && i == m)
kth = b[j+k-index];
return kth;
}
public:
double findMedianSortedArrays(int A[], int m, int B[], int n)
{
int total = m + n;
if (total & 0x1) // odd
return findKth(A, m, B, n, (total + ) / );
else // even
return (findKth(A, m, B, n, total / )
+ findKth(A, m, B, n, total / + )) / ;
}
};

原链接的代码在线测试时会出现本来是100000.5的却错误输出为100000.25,原因是原作者在k==2的时候假设错误了,并且在之后的index中没有考虑到index到了k值但是还没有达到第k小,要用小于等于号,而不是小于号,详见上述代码中注释。修改后就通过了。

暂且知道这两种方法,暂不深究了,继续前行

最新文章

  1. DataTable筛选出现异常
  2. JAVA线程池原理详解二
  3. h.SSL协议栈整体分解
  4. 0506团队项目-Scrum 项目1.0
  5. jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
  6. Top 5 Free Screen Recording Softwares For Windows
  7. TortoiseGit(乌龟git)保存用户名密码的方法(转)
  8. 如何重载ComboBox 使其下拉按钮(带下箭头的)和下拉列表的垂直滚动条的宽度改变?(自绘ComboBox) [转]
  9. WCF 双工通信
  10. vue项目引入bootstrap、jquery
  11. vue-router源码学习(一)
  12. react组件开发规范(一)
  13. Java-ServletOutputStream
  14. unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机
  15. java框架之Struts2(3)-OGNL&amp;ValueStack
  16. java课堂笔记3
  17. VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)
  18. bzoj1497 [NOI2006]最大获利 最大权闭合子图
  19. Eclipse集成Tomcat插件(特别简单)
  20. debian新增加用户 拥有ROOT权限

热门文章

  1. 使用方便 正则表达式grep,sed,awk(一)
  2. html分析器——jericho-html-3.3分解table
  3. navicat如何导入sql文件
  4. (插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。
  5. HTML5分析实战WebSockets基本介绍
  6. The Swift Programming Language中国完整版
  7. Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置
  8. java数据结构系列——排列(2):有序阵列
  9. hdu 5060 War
  10. activiti入门2流程引擎API和服务基础设施