关注
/**
* 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
相关推荐
03-06 20:09
贵州大学 Java King987:你这个学历找个中大厂刷实习经历都是可以的,但是项目要有亮点才行,这个什么外卖就不要做了,去找找最新的项目,至少涉及高并发或者是新型的AI技术mcp rag啥的 ,我在出简历点评,但是你这个没什么好点评的,内容太少,而且含金量太低。自己改一改吧,或者看一下我的项目地址中,那里有大厂最近做过的实习项目
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
5849次浏览 55人参与
# 百度工作体验 #
316413次浏览 2233人参与
# MiniMax求职进展汇总 #
25695次浏览 323人参与
# 沪漂/北漂你觉得哪个更苦? #
2024次浏览 46人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16992次浏览 137人参与
# 春招至今,你的战绩如何? #
17253次浏览 154人参与
# 米连集团26产品管培生项目 #
7845次浏览 237人参与
# 你的实习产出是真实的还是包装的? #
3906次浏览 65人参与
# HR最不可信的一句话是__ #
1256次浏览 35人参与
# AI面会问哪些问题? #
1172次浏览 31人参与
# 你做过最难的笔试是哪家公司 #
1548次浏览 24人参与
# 从事AI岗需要掌握哪些技术栈? #
693次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
3279次浏览 58人参与
# 面试被问第一学历差时该怎么回答 #
273590次浏览 2214人参与
# 简历第一个项目做什么 #
32319次浏览 376人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
153031次浏览 889人参与
# 简历中的项目经历要怎么写? #
311481次浏览 4294人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8102次浏览 44人参与
# XX请雇我工作 #
51179次浏览 172人参与
# 投格力的你,拿到offer了吗? #
178502次浏览 891人参与
# 秋招白月光 #
732004次浏览 5441人参与
# 你都在哪些场所面过试? #
74871次浏览 498人参与
查看14道真题和解析