两个排序的数组 A 和 B 分别含有 m 和 n 个数,找到两个排序数组的中位数,要求时间复杂度应为 O(log (m+n))。
在线评测地址:
说明
中位数的定义:
如果有数组中有 n 个数且 n 是奇数,则中位数为 A[(n-1)/2]
如果有数组中有 n 个数且 n 是偶数,则中位数为 (A[n / 2] + A[n / 2 + 1]) / 2
样例 1
输入:
A = [1,2,3,4,5,6]
B = [2,3,4,5]
输出: 3.5
样例 2
输入:
A = [1,2,3]
B = [4,5]
输出: 3
算法:归并
解题思路
算法流程
复杂度分析
时间复杂度:O(m+n),m 和 n 分别是两个数组的长度。双指针遍历两个数组,指针移动次数是 0(m+n)级。
public class Solution {
/*
* @param A: An integer array
* @param B: An integer array
* @return: a double whose format is *.5 or *.0
*/
public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length, n = B.length;
int p1 = 0, p2 = 0;
int left = -1, right = -1;
for (int i = 0; i < (m + n) / 2 + 1; i ++){
left = right;
// p2 右移
if (p1 >= A.length || p2 < B.length && A[p1] > B[p2]){
right = B[p2++];
}
// p1 右移
else {
right = A[p1++];
}
}
return (m + n) % 2 == 1 ? right : (left + right) / 2.0;
}
}
二分和快速选择等更多解法见:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.