【leetcode刷题笔记】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 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的更多相关文章
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...
- 刷题4. Median of Two Sorted Arrays
一.题目 Median of Two Sorted Arrays,具体请自行搜索. 这个题目,我看了一下,经过一番思考,我觉得实现起来不是很复杂. 但要做到bug free也不难,最大的问题是性能问题 ...
- 【leetcode刷题笔记】Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题 ...
- (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 ...
- 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 ...
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- 【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 ...
随机推荐
- 这是一篇markdown测试博客
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...
- Asteroids - poj 3041(二分图最大匹配问题)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17258 Accepted: 9386 Description Be ...
- onload 和 onunload 事件
onload 和 onunload 事件会在用户进入或离开页面时被触发. onload 事件可用于检测访问者的浏览器类型和浏览器版本,并基于这些信息来加载网页的正确版本. onload 和 onunl ...
- Cut the rope
http://acm.nyist.net/JudgeOnline/problem.php?pid=651 描述We have a rope whose length is L. We will cut ...
- MTK驱动探索:mtk6582添加tp驱动s3203
代码从mtk6589平台移植,ic为用户定制. 解决的问题有: 一.build err:主要原因是89和82平台函数和宏定义冲突,如: extern void mt_eint_unmask(unsig ...
- UICollectionView sectionHeader and sectionFooter悬浮
UICollectionViewFlowLayout *yLayout = [[UICollectionViewFlowLayout alloc] init]; yLayout.sectionHead ...
- PHP中常用的输出语句比较?
面试中经常问到这个,可以看下. 面试问题:比较echo print() print_r() var_dump()? echo(): 可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(la ...
- js 的函数参数的默认值问题
js函数参数设置默认值 php有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){ return $a+$b; } echo simu ...
- mybatis基础,mybatis配置文件核心组件typeAliases元素
typeAliases元素,术语类型别名 类型别名是为 Java 类型设置一个短的名字.它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余 <typeAliases> & ...
- Android开发:《Gradle Recipes for Android》阅读笔记1.3
想命令行执行gradle的构建,可以通过提供的gradle wrapper或者安装gradle. 构建android项目不需要安装gradle,因为android studio已经包含gradle.& ...