思路:双指针
用两个变量left
,right
记录中位数的值。
已知两个数组的长度,可以很容易找到中位数的位置,但是需要讨论奇偶。
对于偶数数组[1,2],[3,4]
,我们希望记录中位数2,3
,即left
记录2
,right
记录3
,最后返回(float)(left + right) / 2
,此时移动3次指针;
对于奇数数组[1,2,3],[4,5]
,我们希望记录中位数3
,即left
记录2
,right
记录3
,最后返回right
,此时也移动3次指针;
因此,不论奇偶,指针移动(n1 + n2) / 2 + 1
。
用两个指针分别遍历两个数组来寻找中位数。
代码:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n1 = nums1.length;
int n2 = nums2.length;
int mid = (n1 + n2) / 2 + 1;
int left = 0, right = 0;
int point1 = 0, point2 = 0;
while (point1 < n1 && point2 < n2 && mid > 0) {
if (nums1[point1] > nums2[point2]) {
left = right;
right = nums2[point2];
point2++;
}
else {
left = right;
right = nums1[point1];
point1++;
}
mid--;
}
if (mid > 0) {
while (point1 < n1 && mid > 0) {
left = right;
right = nums1[point1];
point1++;
mid--;
}
while (point2 < n2 && mid > 0) {
left = right;
right = nums2[point2];
point2++;
mid--;
}
}
if (0 == (n1 + n2) % 2) {
return (float)(left + right) / 2;
}
return right;
}
}