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的理解,如果A,B合并后的序列有奇数个元素,那么中间元素就是下标为(a.length+b.length)/2的元素;而如果合并后的序列有偶数个元素,那么median是下标为(a.length+b.length)/2和(a.length+b.length)/2-1两个元素的平均数。

我们实现一个二分在有序两个数组中找第k小的数的函数,然后在主函数中,根据合并后数组元素个数的奇偶性调用这个函数。

首先来看这个在两个有序数组中找第k小的数的函数 private double findKth(int a[],int b[],int k,int a_start,int b_start){ 。它的原理如下图所示:

即:

if(a_mid < b_mid)
return findKth(a, b, k-k/2, a_start+k/2, b_start);
else
return findKth(a, b, k-k/2, a_start, b_start+k/2);

再来看求解函数 public double findMedianSortedArrays(int A[], int B[]) ,当A和B合并后元素个数为奇数的时候,我们直接调用 findKth(A, B, (B.length+A.length)/2+1, 0, 0) 找到第(A.length+B.length)/2的数就是中位数了。而当A和B的合并后元素个数为偶数的时候,我们要调用两次findKth分别找到第(A.length+B.length)/2和第(A.length+B.length)/2-1的数,然后求它们的平均数,即 (findKth(A, B, (A.length+B.length)/2, 0, 0) + findKth(A, B, (A.length+B.length)/2+1, 0, 0)) / 2.0 。

代码如下:

 public class Solution {
private double findKth(int a[],int b[],int k,int a_start,int b_start){
//if a is empty
if(a_start >= a.length)
return b[b_start+k-1];
if(b_start >= b.length)
return a[a_start+k-1]; if(k == 1)
return Math.min(a[a_start], b[b_start]); int a_mid = a_start + k/2 -1 < a.length?a[a_start+k/2-1]:Integer.MAX_VALUE;
int b_mid = b_start + k/2 -1 < b.length?b[b_start+k/2-1]:Integer.MAX_VALUE; if(a_mid < b_mid){
return findKth(a, b, k-k/2, a_start+k/2, b_start);
}
else
return findKth(a, b, k-k/2, a_start, b_start+k/2); }
public double findMedianSortedArrays(int A[], int B[]) {
int len = A.length + B.length;
if(len % 2 == 0)
return (findKth(A, B, len/2, 0, 0) + findKth(A, B, len/2+1, 0, 0)) / 2.0;
else
return findKth(A, B, len/2+1, 0, 0);
}
}

【leetcode刷题笔记】Median of Two Sorted Arrays的更多相关文章

  1. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

  2. 刷题4. Median of Two Sorted Arrays

    一.题目 Median of Two Sorted Arrays,具体请自行搜索. 这个题目,我看了一下,经过一番思考,我觉得实现起来不是很复杂. 但要做到bug free也不难,最大的问题是性能问题 ...

  3. 【leetcode刷题笔记】Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题 ...

  4. (python)leetcode刷题笔记04 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectiv ...

  5. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  6. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  7. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  8. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

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

随机推荐

  1. hdu5800 To My Girlfriend dp 需要比较扎实的dp基础。

    To My Girlfriend Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. 十年WEB技术发展历程

    一个小分享,知识有限,抛砖引玉. ajax 03年的时候我上六年级,那时候网吧刚在小县城的角落萌生.传奇,大话西游第一代网游一时风靡.我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一 ...

  3. python 案例:使用BeautifuSoup4的爬虫

    我们以腾讯社招页面来做演示:http://hr.tencent.com/position.php?&start=10#a 使用BeautifuSoup4解析器,将招聘网页上的职位名称.职位类别 ...

  4. Java类载入器原理分析

    一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap  ExtClassLoader  AppClassLoader 类载入器也是Java类.由于其它Java类 ...

  5. TBSchedule源码阅读2-TBScheduleManagerFactory 定时任务ManagerFactoryTimerTask

    定时任务 : 主要功能:监听zookeeper状态,正常则this.factory.refresh(),异常则this.factory.reStart(); 1 正常情况this.factory.re ...

  6. myeclipse中文编码错误,没有GBK选项

    默认编码是UTF-8,但是导入GBK工程后,直接改为ISO-8859-1,但是还是编码错误. 用网上的: 全局编码设置:编码设置的方法:ToolBar-->Window-->Prefere ...

  7. tinyint(4),tinyint(80)有什么区别

    tinyint格式: TINYINT[(M)] [UNSIGNED] [ZEROFILL] M默认为4 Tinyint占用1字节的存储空间,即8位(bit). 带符号的范围是-128到127.无符号的 ...

  8. oracle 启动模式

    转载自:http://blog.csdn.net/nsj820/article/details/6573525 <一>.ORACLE数据库启动模式 1.启动SQL*PLUS不与数据库连接 ...

  9. JAVA 虚拟机内存

    1.普通java应用程序,使用java命令运行, java -Xms1024m -Xmx1024m -XX:MaxNewSize=256m  -XX:MaxPermSize=256m -jar 2.t ...

  10. 关于 SQLNET.AUTHENTICATION_SERVICES 验证方式的说明

    今天去客户那里巡检,客户提出为了提高数据库安全性考虑,须要改动sys/systempassword,并通过数据库验证方式来代替默认的操作系统方式,如今我来把这两种验证方式总结一下. 操作系统验证.即通 ...