两个排序的数组 A 和 B 分别含有 m 和 n 个数,找到两个排序数组的中位数,要求时间复杂度应为 O(log (m+n))。
中位数的定义:
中位数
等同于数学定义里的中位数
。样例 1
输入:
A = [1,2,3,4,5,6]
B = [2,3,4,5]
输出: 3.5
样例 2
输入:
A = [1,2,3]
B = [4,5]
输出: 3
分治法。时间复杂度 log(n + m)log(n+m)
这题是面试高频题,除了分治法外,还有二分法等其他方法来解,点击链接立即免费试听:https://www.jiuzhang.com/course/9/?utm_source=sc-v2ex-fks免费试听,攻略还有更多大厂常考题型。
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
int n = A.length + B.length;
if (n % 2 == 0) {
return (
findKth(A, 0, B, 0, n / 2) +
findKth(A, 0, B, 0, n / 2 + 1)
) / 2.0;
}
return findKth(A, 0, B, 0, n / 2 + 1);
}
// find kth number of two sorted array
public static int findKth(int[] A, int startOfA,
int[] B, int startOfB,
int k){
if (startOfA >= A.length) {
return B[startOfB + k - 1];
}
if (startOfB >= B.length) {
return A[startOfA + k - 1];
}
if (k == 1) {
return Math.min(A[startOfA], B[startOfB]);
}
int halfKthOfA = startOfA + k / 2 - 1 < A.length
? A[startOfA + k / 2 - 1]
: Integer.MAX_VALUE;
int halfKthOfB = startOfB + k / 2 - 1 < B.length
? B[startOfB + k / 2 - 1]
: Integer.MAX_VALUE;
if (halfKthOfA < halfKthOfB) {
return findKth(A, startOfA + k / 2, B, startOfB, k - k / 2);
} else {
return findKth(A, startOfA, B, startOfB + k / 2, k - k / 2);
}
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.