LeetCode: Median of Two Sorted Arrays 解题报告
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 解题报告的更多相关文章
- [leetcode]Median of Two Sorted Arrays @ Python
原题地址:https://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 题意:There are two sorted arrays A ...
- [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 ...
- 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 ...
- LeetCode—— Median of Two Sorted Arrays
Description: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the medi ...
- 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 ...
- C++ Leetcode Median of Two Sorted Arrays
坚持每天刷一道题的小可爱还没有疯,依旧很可爱! 题目:There are two sorted arrays nums1 and nums2 of size m and n respectively. ...
- LeetCode: Search in Rotated Sorted Array 解题报告
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- 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 ...
- 【LeetCode】88. Merge Sorted Array 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 新建数组 日期 题目地址:https://leetc ...
随机推荐
- 修改Cygwin的默认启动路径
原先启动Cygwin后,pwd显示: C:\Documents and Settings\Administrator@IBM-EBDC0EAC4B7 ~$ pwdC:\Documents and Se ...
- TP3.2批量上传文件(图片),解决同名冲突问题
1.html <form action="{:U('Upload/index')}" enctype="multipart/form-data" meth ...
- 创建表时 ORA-00955: 名称已由现有对象使用
如下,在执行创建表语句时报错如下: 执行下面sql查询 select a.OBJECT_type,a.* from all_objects a where upper(a.OBJECT_NAME) = ...
- kubectl命令使用
语法: kubectl [command] [TYPE] [NAME] [flags] 1 command:子命令,用于操作Kubernetes集群资源对象的命令,如create, de ...
- [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口(转)
转自:[CXF REST标准实战系列] 二.Spring4.0 整合 CXF3.0,实现测试接口 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现W ...
- Google Chrome调试js代码,开发者工具之调试工具常用功能
参考:Google Chrome调试js代码-http://www.open-open.com/lib/view/open1384785324165.html 重点:左下角一个{}括号图标按钮用于把杂 ...
- python学习笔记011——检查变量类型type()
>>> a = 1 >>> type(a) <class 'int'> >>> b = 1.0 >>> type(b ...
- setContentView(R.layout.activity_main)无法正常引用
今天在写Android代码的过程中,编译器一直报错,错误出在这一行代码: setContentView(R.layout.activity_main) 提示信息是: activity_main can ...
- linux内核线程,进程,线程
http://blog.csdn.net/dyllove98/article/details/8917197 Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起.( ...
- STL应用之set
之前在解决一道算法题的时候,应用到set,特意对这个stl的容器类做了一些了解.在我的印象中,set就是一个元素不重复的集合,而事实上也正是这样的.无论从MSDN还是任何其它地方,都会告诉我们set的 ...