关注
/**
* 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
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
- 1... AI Agent 面试 Top50 必刷题1.8W
- 2... 看不懂组内文档,实习怎么偷产出?8836
- 3... 解决了xd们,发了个dy曝光视频,十几万播放,直接让他火速联系我,赔我路费了,兄弟们碰到不公平的违法行为,一定要积极捍卫自己权益4628
- 4... 要对实习同事表白吗?4601
- 5... 五月了,感觉实习很难找了4311
- 6... 理性讨论,卷实习算不算工贼行为?4158
- 7... 妈妈只想要你快乐3486
- 8... 三段大厂,说下我见过的最低学历3302
- 9... 26届双非本求职总结3174
- 10... 逆天操作,也是让我遇到了3097
正在热议
更多
# 26届春招投递记录 #
35604次浏览 296人参与
# 你今年的平均薪资是多少? #
229867次浏览 1065人参与
# 27届实习投递记录 #
120021次浏览 1369人参与
# 求职你最看重什么? #
170251次浏览 914人参与
# 如何成为1个AI工程师? #
5472次浏览 273人参与
# 我想象的实习vs现实的实习 #
340632次浏览 2315人参与
# 要毕业了,再不说就来不及了 #
8510次浏览 150人参与
# 硬件人的简历怎么写 #
349564次浏览 3141人参与
# 你在职场上见过哪些“水货”同事 #
41905次浏览 179人参与
# 秋招提前批,你开始投了吗 #
766445次浏览 8495人参与
# 哪些公司校招卡第一学历 #
262369次浏览 879人参与
# 你觉得机械有必要实习吗 #
88991次浏览 536人参与
# 机械人的秋招小目标 #
32918次浏览 251人参与
# 面试被问第一学历差时该怎么回答 #
297056次浏览 2306人参与
# 国庆假期,给大脑放个假 #
26913次浏览 121人参与
# 提名点击就挂的公司 #
146590次浏览 494人参与
# AI面会问哪些问题? #
136307次浏览 3634人参与
# 秋招想进国企该如何准备 #
150478次浏览 693人参与
# 机械人,你的秋招第一份简历被谁挂了 #
272469次浏览 2455人参与
# 携程笔试 #
179762次浏览 926人参与

TCL公司福利 1293人发布