两个排序的数组 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;
}
}
二分和快速选择等更多解法见:
1
Still4 2020-09-02 10:12:54 +08:00
想了半天既然是排过序的数组,时间复杂度为什么是 O(log (m+n)),结果看解答里面果然是 O(m+n)
|
2
Still4 2020-09-02 10:20:13 +08:00
所以其实解法根本没有达到题目的要求啊,logn 的时间复杂度,只能用二分法
|