关注
/**
* Created by tlh on 2017/5/17.
* 求两个排序数组合并后的中位数
* 设数组A和B,长度分别为m和n, 要求时间复杂度为O(log(m+n))。
* 用二分查找的思想,求合并后数组的第k个数。每次二分的过程都要设法舍弃掉数组的一部分,从而达到收敛缩小查找范围的效果。
* 从数组A和B分别取第k/2个数,当A[k/2-1] < B[k/2-1],则A的前k/2个元素必定在合并后的数组的前k个元素内,舍弃这A的前k/2个元素。
* 否则,舍弃B中前k/2个数。
* 接下来,递归在剩下的(m+n-k/2)的元素中找第(k-k/2)元素。
* https://www.jiuzhang.com/qa/1768/
*/
public class MedianOfTwoSortedArrays {
// 找到第K个元素
private int findKth(int[] A, int iA, int jA, int[] B, int iB, int jB, int k) {
int m = jA - iA + 1; // 数组A的长度
int n = jB - iB + 1; // 数组B的长度
if (n < m) return findKth(B, iB, jB, A, iA, jA, k); // 保证数组A长度比数组B长度小
if (m == 0) return B[k - 1]; // 当较小的数组跑完了,返回数组B的第k个
if (k == 1) return Math.min(A[iA], B[iB]); // 返回第1个数
// 将k分成两部分
int lenA = Math.min(k / 2, m); // 取数组A的前lenA个元素
int lenB = k - lenA; // 取数组B的前lenB个元素
int pa = iA + lenA - 1; // 数组A的第lenA个元素
int pb = iB + lenB - 1; // 数组B的第lenB个元素
// 判断A[pa]和B[pb]的大小
if (A[pa] < B[pb]) return findKth(A, pa + 1, jA, B, iB, jB, k - lenA); // 舍弃数组A的前lenA个元素
else if (A[pa] > B[pb]) return findKth(A, iA, jA, B, pb + 1, jB, k - lenB); // 舍弃数组B的lenB个元素
else return A[pa]; // A[pa]或B[pb]就是对应的第k个数
}
public float getMedian(int[] A, int[] B) {
int totalLen = A.length + B.length;
if ((totalLen & 1) == 1) { // 总数组长度为奇数
return findKth(A, 0, A.length - 1, B, 0, B.length - 1, totalLen / 2);
} else { // 总数组长度为偶数
return (findKth(A, 0, A.length - 1, B, 0, B.length - 1, totalLen / 2) +
findKth(A, 0, A.length - 1, B, 0, B.length - 1, totalLen / 2 + 1)) / 2.0f;
}
}
查看原帖
点赞 3
相关推荐
08-31 01:30
清华大学 Java 点赞 评论 收藏
分享
09-04 20:39
南京林业大学 机械工程师
阿武同学:基本信息保留前面三行,其他的可以全部删掉,邮箱最重要的你没写,主修课程精简到8个以内,实习里面2/3/4都是水内容的,非要写的话建议两到三句话,项目经历排版优化下,自我评价缩到三行 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 牛客树洞,我想对你说 #
16169次浏览 120人参与
# 求职中的尴尬瞬间 #
6810次浏览 54人参与
# 快手技术岗信息交流阵地 #
7312次浏览 54人参与
# 大学最后一个寒假,我想…… #
55314次浏览 604人参与
# 牛客周边新品开箱 #
11712次浏览 91人参与
# 牛友的志愿填报指南 #
36458次浏览 188人参与
# 研究所笔面经互助 #
97764次浏览 550人参与
# 如何KTV领导 #
74109次浏览 505人参与
# 应届生被毁约被毁意向了怎么办 #
47788次浏览 280人参与
# 你最满意的offer薪资是哪家公司? #
42409次浏览 212人参与
# 硬件人的春招flag #
52968次浏览 435人参与
# 机械人避雷的岗位/公司 #
30104次浏览 249人参与
# 怎么给家人解释你的工作? #
15222次浏览 87人参与
# 得物app工作体验 #
30003次浏览 69人参与
# 国企还是互联网,你怎么选? #
172555次浏览 1305人参与
# 打工人锐评公司红黑榜 #
176025次浏览 1023人参与
# 你的mentor是什么样的人? #
18938次浏览 120人参与
# 大疆工作体验 #
20009次浏览 85人参与
# 帮我看看,领导说这话什么意思? #
25108次浏览 108人参与
# 机械人集合!你是什么工程师? #
21174次浏览 91人参与
# 校招泡的最久的公司是哪家? #
15801次浏览 95人参与
爱玛科技公司福利 6人发布