关注
给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数。
例如:
arr1 = {1,2,3,4,5};
arr2 = {3,4,5};
K = 1;
因为1为所有数中最小的,所以返回1;
arr1 = {1,2,3};
arr2 = {3,4,5,6};
K = 4;
因为3为所有数中第4小的数,所以返回3;
要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。
public static int findKthNum(int[] arr1, int[] arr2, int kth) {
if (arr1 == null || arr2 == null) {
throw new RuntimeException("Your arr is invalid!");
}
if (kth < 1 || kth > arr1.length + arr2.length) {
throw new RuntimeException("K is invalid!");
}
int[] longArr = arr1.length >= arr2.length ? arr1 : arr2;
int[] shortArr = arr1.length < arr2.length ? arr1 : arr2;
int lenL = longArr.length;
int lenS = shortArr.length;
if (kth <= lenS) {
return getUpMedian(shortArr, 0, kth - 1, longArr, 0, kth - 1);
}
if (kth > lenL) {
if (shortArr[kth - lenL - 1] >= longArr[lenL - 1]) {
return shortArr[kth - lenL - 1];
}
if (longArr[kth - lenS - 1] >= shortArr[lenS - 1]) {
return longArr[kth - lenS - 1];
}
return getUpMedian(shortArr, kth - lenL, lenS - 1, longArr, kth - lenS, lenL - 1);
}
if (longArr[kth - lenS - 1] >= shortArr[lenS - 1]) {
return longArr[kth - lenS - 1];
}
return getUpMedian(shortArr, 0, lenS - 1, longArr, kth - lenS, kth - 1);
}
public static int getUpMedian(int[] arr1, int start1, int end1, int[] arr2,
int start2, int end2) {
if (start1 == end1) {
return Math.min(arr1[start1], arr2[start2]);
}
int offset = ((end1 - start1 + 1) & 1) ^ 1;
int mid1 = (start1 + end1) / 2;
int mid2 = (start2 + end2) / 2;
if (arr1[mid1] > arr2[mid2]) {
return getUpMedian(arr1, start1, mid1, arr2, mid2 + offset, end2);
} else if (arr1[mid1] < arr2[mid2]) {
return getUpMedian(arr1, mid1 + offset, end1, arr2, start2, mid2);
} else {
return arr1[mid1];
}
}
查看原帖
点赞 3
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你小心翼翼的闯过多大的祸? #
3972次浏览 68人参与
# 找不到实习会影响秋招吗 #
1399830次浏览 13635人参与
# 实习没事做是福还是祸? #
4300次浏览 68人参与
# 重来一次,你会对开始求职的自己说 #
938次浏览 19人参与
# 2025年终总结 #
134429次浏览 2294人参与
# 考研人,我有话说 #
156602次浏览 1211人参与
# 哪些公司笔/面试难度大? #
7078次浏览 32人参与
# 实习简历求拷打 #
24114次浏览 249人参与
# 你觉得现在还能进互联网吗? #
29962次浏览 201人参与
# 携程工作体验 #
18957次浏览 66人参与
# 大厂VS公务员你怎么选 #
69143次浏览 638人参与
# 扒一扒那些奇葩实习经历 #
140180次浏览 1149人参与
# 找不到好工作选择GAP真的丢人吗 #
93707次浏览 1007人参与
# 那些我实习了才知道的事 #
253110次浏览 1785人参与
# 非技术投递记录 #
672935次浏览 6820人参与
# 机械求职避坑tips #
81089次浏览 531人参与
# 投格力的你,拿到offer了吗? #
154962次浏览 829人参与
# 第一份工作能做外包吗? #
94065次浏览 599人参与
# 作业帮求职进展汇总 #
85484次浏览 559人参与
# 秋招遇到的奇葩面试题 #
101265次浏览 416人参与
