题目描述
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
找到两个排序数组的中位数,要求时间复杂度为 O(log(m+n))。
解题思路
-
假设 nums1.length=m,nums2.length=n,m<n,把 nums1 和 nums2 分为左右两部分;
-
left_part={nums1[0:i],nums2[0:j]},right_part={nums1[i:m],nums2[j:n]};
-
要保证:
-
Math.abs(len(left_part)-len(right_part))<=1;
-
max(left_part)=max(right_part)。
-
-
所以,要满足以下条件:
-
j=(m+n+1)/2-i;
-
nums1[i-1]
-
-
然后采用二分法,寻找合适的 i:
-
如果 nums1[i-1]>nums2[j],说明 left_part 中 nums1 太多,i 要变小;
-
如果 nums2[j-1]>nums1[i],说明 left_part 中 nums1 太少,i 要变小;
-
如果 nums1[i-1]
-
-
如果 m+n 是奇数,返回 left_part 的最大值;
-
如果 m+n 是偶数,返回 left_part 和 right_part 最大值的平均数。
代码
class Solution {
public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;
int n = B.length;
if (m > n) {
int[] temp = A;
A = B;
B = temp;
int tmp = m;
m = n;
n = tmp;
}
int iMin = 0;
int iMax = m;
int halfLen = (m + n + 1) / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
if (i < iMax && B[j-1] > A[i]){
iMin = iMin + 1;
}
else if (i > iMin && A[i-1] > B[j]) {
iMax = iMax - 1;
} else {
int maxLeft = 0;
if (i == 0)
maxLeft = B[j-1];
else if (j == 0)
maxLeft = A[i-1];
else
maxLeft = Math.max(A[i-1], B[j-1]);
if ( (m + n) % 2 == 1 )
return maxLeft;
int minRight = 0;
if (i == m)
minRight = B[j];
else if (j == n)
minRight = A[i];
else
minRight = Math.min(B[j], A[i]);
return (maxLeft + minRight) / 2.0;
}
}
return 0.0;
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于