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

SOLTION 1:

1. 我们借用findKthNumber的思想。先实现findKthNumber,如果是偶数个,则把中间2个加起来平均,奇数就用中间的。

2. 为了达到LOG级的复杂度,我们可以这样:

每次在A,B取前k/2个元素。有以下这些情况:

1).  A的元素个数 < k/2. 则我们可以丢弃B前k/2. 反之亦然

证明:

我们使用反证法。

假设第K大在B的前k/2中,例如位置在索引m(m <= k/2-1)那么A必然拥有前k中的k -(m+1)个元素,而

m <= k/2-1,则 m+1 <= k/2  , k - (m+1) >= k/2与条件:A的元素不够k/2矛盾,所以假设不成立,得证。

举个栗子:

A: 6 7 8

B: 1 2 3 4 5

找第8大的数字,

2). A[mid] < B[mid] (mid是k/2 -1索引处的元素)。

这种情况下,我们可以丢弃A前k/2。

证明:

我们使用反证法。

假设第K大在A的前k/2中记为maxK,例如位置在索引m(m <= k/2-1)那么B必然拥有前k中的k -(m+1)个元素,而

m <= k/2-1,则 m+1 <= k/2  , k - (m+1) > k/2

推出B[mid] <= maxK

而A[mid] >= maxK 推出 A[mid]>=B[mid], 与题设矛盾。所以假设不能成立。

举个栗子:

A: 1 2

B: 4 5 6 7 8

找第四大的数字 我们就可以首先排除1,2.

 public double findMedianSortedArrays(int A[], int B[]) {
if (A == null || B == null) {
return 0;
} int len = A.length + B.length; double ret = 0;
// 偶数个元素
if (len % 2 == 0) {
ret = (findKth(A, B, 0, 0, len / 2) + findKth(A, B, 0, 0, len / 2 + 1)) / (double)2.0;
} else {
// 奇数个元素
ret = findKth(A, B, 0, 0, len / 2 + 1);
} return ret;
} // Find the Kth large number.
public int findKth(int A[], int B[], int indexA, int indexB, int k) {
int lenA = A.length;
int lenB = B.length; if (indexA >= lenA) {
return B[indexB + k - 1];
} else if (indexB >= lenB) {
return A[indexA + k - 1];
} // Base Case, pay attention. 在这里必须要退出。因为k = 1的时候,不可能再分了。
if (k == 1) {
return Math.min(A[indexA], B[indexB]);
} // -1是因为索引本身是从0开始的。而前k大元素含有k个元素。
int mid = k / 2 - 1; // 注意,越界条件是 >= lenA. 怎么老是犯这个错误。。
int keyA = indexA + mid >= lenA ? Integer.MAX_VALUE: A[indexA + mid];
int keyB = indexB + mid >= lenB ? Integer.MAX_VALUE: B[indexB + mid]; // 因为丢弃了k / 2个元素
int kNew = k - k / 2; if (keyA < keyB) {
return findKth(A, B, indexA + k / 2, indexB, kNew);
} else {
return findKth(A, B, indexA, indexB + k / 2, kNew);
}
}

2015.1.25

可以优化一下,在找到kth number时可以及时退出:

 public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
//
if (A == null || B == null) {
return ;
} int len = A.length + B.length;
if (len % == ) {
return (double)(dfs(A, B, , , len / ) + dfs(A, B, , , len / + )) / 2.0;
} else {
return dfs(A, B, , , len / + );
}
} public double dfs1(int A[], int B[], int aStart, int bStart, int k) {
if (aStart >= A.length) {
return B[bStart + k - ];
} else if (bStart >= B.length) {
return A[aStart + k - ];
} if (k == ) {
return Math.min(A[aStart], B[bStart]);
} // k = 4;
// mid = 1;
int mid = k / - ; if (aStart + mid >= A.length) {
// drop the left side of B.
return dfs(A, B, aStart, bStart + k / , k - k / );
} else if (bStart + mid >= B.length) {
// drop the left side of A.
return dfs(A, B, aStart + k / , bStart, k - k / );
} else if (A[aStart + mid] > B[bStart + mid]) {
// drop the left side of B.
return dfs(A, B, aStart, bStart + k / , k - k / );
// 当2者相等,有2种情况:
// 1. 当k为偶数,则kth存在于任何一个结尾处,其实也是可以丢弃一半的。
// 2. 当k为奇数,则kth不存在于A,B的left side。也是可以丢弃任意一半。
//} else if (A[aStart + mid] < B[bStart + mid]) {
} else {
return dfs(A, B, aStart + k / , bStart, k - k / );
} //return A[aStart + mid];
} public double dfs(int A[], int B[], int aStart, int bStart, int k) {
if (aStart >= A.length) {
return B[bStart + k - ];
} else if (bStart >= B.length) {
return A[aStart + k - ];
} if (k == ) {
return Math.min(A[aStart], B[bStart]);
} // k = 4;
// mid = 1;
int mid = k / - ; if (aStart + mid >= A.length) {
// drop the left side of B.
return dfs(A, B, aStart, bStart + k / , k - k / );
} else if (bStart + mid >= B.length) {
// drop the left side of A.
return dfs(A, B, aStart + k / , bStart, k - k / );
} else if (A[aStart + mid] > B[bStart + mid]) {
// drop the left side of B.
return dfs(A, B, aStart, bStart + k / , k - k / );
} else if (A[aStart + mid] < B[bStart + mid]) {
return dfs(A, B, aStart + k / , bStart, k - k / );
} else {
// drop the left side of A.
//return dfs(A, B, aStart + k / 2, bStart, k - k / 2);
if (k % == ){
return A[aStart + mid];
} // can drop both sides.
return dfs(A, B, aStart + k / , bStart + k / , );
} //return A[aStart + mid];
}
}

GITHUB:

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/array/FindMedianSortedArrays.java

LeetCode: Median of Two Sorted Arrays 解题报告的更多相关文章

  1. [leetcode]Median of Two Sorted Arrays @ Python

    原题地址:https://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 题意:There are two sorted arrays A ...

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

  4. LeetCode—— Median of Two Sorted Arrays

    Description: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the medi ...

  5. Leetcode: Median of Two Sorted Arrays. java.

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  6. C++ Leetcode Median of Two Sorted Arrays

    坚持每天刷一道题的小可爱还没有疯,依旧很可爱! 题目:There are two sorted arrays nums1 and nums2 of size m and n respectively. ...

  7. LeetCode: Search in Rotated Sorted Array 解题报告

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  8. LeetCode——Median of Two Sorted Arrays

    Question There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median o ...

  9. 【LeetCode】88. Merge Sorted Array 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 新建数组 日期 题目地址:https://leetc ...

随机推荐

  1. 11、final详解

    1.final修饰成员变量 即该成员被修饰为常量,意味着不可修改. 对于值类型表示值不可变:对于引用类型表示地址不可变 其初始化可以在三个地方 ①:定义时直接赋值 ②:构造函数 ③:代码块{}或者静态 ...

  2. centos7 卸载 gitlab

    标黑的就是关键命令,先停止gitlab服务,然后rpm -e卸载,然后查看剩余gitlab进程,然后杀死主进程,然后删除所有相关目录 1 [liuyx@MiWiFi-R3L-srv ~]$ sudo ...

  3. LEGO机器人发展史

    1998,cybermaster 1999,RCX 1999,micro scout 2000,scout 2002,spybotics NXT NXT2 EV3

  4. PHP原生:分享一个轻量级的缓存类=>cache.php

    适用:原生PHP cache.php tips:代码最后有适用Demo哦. <?php /* * 缓存类 cache */ define("cacheRoot"," ...

  5. ASP.NET#使用母版时,如果要使用js中的getElementById()方法取得某个内容页的元素时要注意的问题

    当使用母版,要使用js中的getElementById()方法取得某个内容页的元素时,所选取的id并不是母版中内容页的id,而是在设计内容页时设定的id例子:母版页: ...... <head ...

  6. java多线程(一)之继承Thread类

    一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...

  7. vi 删除全部内容

    非插入模式下删除所有内容 a.光标移到第一行,然后按10000后然后点dd b.光标移到第一行,按下dG   命令输入模式下删除所有内容 a.输入命令.,$d,回车 b.输入命令1,999dd,回车

  8. 移动对meta的定义(转)

    以下是meta每个属性详解 尤其要注意的是content里多个属性的设置一定要用分号+空格来隔开,如果不规范将不会起作用. 一.<meta http-equiv="Content-Ty ...

  9. 也来学学插件式开发续-利用MEF

    前面一个博客:也来学学插件式开发中很多朋友留言说可以用MEF来实现.于是我就试着用MEF实现了一下. 步骤和上一篇差不多,只是加载插件的方式有所不同.这只是一个自己的示例程序,肯定有很多不足之处,欢迎 ...

  10. iOS 关于 设计模式 与网友讨论实录

    关于 设计模式 与网友讨论实录 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留 ...