关注
/**
* 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
相关推荐


OPPO
| 实习
| 超多精选岗位
点赞 评论 收藏
分享


思摩尔国际(SMOORE)
| 校招
| 31个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
- 1... 实习怎么偷产出?2.5W
- 2... 面试大厂反拷打指南(字节&腾讯)1.3W
- 3... 有奖征文:职场上哪些行为很加分?投稿得丰厚奖励!8655
- 4... 工科双非一定要读研4575
- 5... 985学长的春招补漏攻略4517
- 6... 明知道自己考不上研,还要坚持吗?4065
- 7... 腾讯IEG-Level Infinite 游戏国际发行-数据和技术支持团队 后台开发实习一面凉经3748
- 8... 双非入职大厂半年了,我有一些心得体会3535
- 9... 要钱后续:钱要到了,但是领导态度怪怪的🥲3535
- 10... 屠龙少年终成恶龙 一些对于过往的碎碎念3046
正在热议
更多
# 运营来爆料 #
27601次浏览 240人参与
# 腾讯云智研发工作体验 #
13254次浏览 107人参与
# 掌阅春招 #
90390次浏览 533人参与
# 你今年的平均薪资是多少? #
95928次浏览 488人参与
# 材料人,你最希望上岸的是? #
4575次浏览 33人参与
# 在职场上,你最讨厌什么样的同事 #
10925次浏览 139人参与
# 如何缓解入职前的焦虑 #
142607次浏览 1140人参与
# 你遇到过哪些神仙同事 #
46173次浏览 482人参与
# 你最近一次加班是什么时候? #
32785次浏览 252人参与
# 考研人,我有话说 #
19602次浏览 361人参与
# 上班到公司第一件事做什么? #
29168次浏览 293人参与
# 硬件人的简历怎么写 #
241484次浏览 2818人参与
# 软件开发春招备战日记 #
58627次浏览 504人参与
# 工作中哪个瞬间让你想离职 #
21472次浏览 157人参与
# 我的国央企投递进展 #
36669次浏览 247人参与
# 产品每日一题 #
29408次浏览 413人参与
# 你知道哪些职场黑话? #
22006次浏览 181人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
74271次浏览 550人参与
# 985本硕1个中小厂offer,摆烂or继续努力 #
100416次浏览 699人参与
# 软开人,秋招你打算投哪些公司呢 #
67834次浏览 728人参与
# 你投递的公司有几家约面了? #
39750次浏览 238人参与