首先,我们需要明确什么是中位数。在一组数据中,中位数是指将这组数据从小到大排列后,处于中间位置的数。如果这组数据的数量是偶数,则中位数是中间两个数的平均值。
接下来我们来看如何用Java实现这个功能。假设我们有两个已经排序好的数组A和B,我们的目标是找到这两个数组合并后的中位数。
- 首先,我们可以使用一个变量len来存储两个数组的长度之和。
- 然后,我们定义两个指针i和j,分别指向数组A和B的第一个元素。
- 接下来,我们需要维护两个指针的位置关系,使得两个指针之间的距离小于或等于len/2(如果len是奇数),或者小于len/2+1(如果len是偶数)。这是因为我们要找的是中位数,所以两个指针之间的元素个数应该尽可能地接近len/2。
- 我们通过不断地比较两个指针指向的元素大小,并移动较小的那个指针来达到上述目的。
- 当满足条件时,我们就找到了中位数。如果是偶数个元素,那么中位数就是两个指针指向元素的平均值;如果是奇数个元素,那么中位数就是较大的那个指针所指向的元素。
以下是具体的Java代码:
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len = nums1.length + nums2.length;
if (len == 0) return 0.0;
int iMin = 0, iMax = nums1.length, halfLen = len / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
int imin = i == 0 ? Integer.MAX_VALUE : nums1[i - 1];
int jmin = j == 0 ? Integer.MAX_VALUE : nums2[j - 1];
int imax = i == iMax ? Integer.MIN_VALUE : nums1[i];
int jmax = j == nums2.length ? Integer.MIN_VALUE : nums2[j];
if (imin > jmax) iMax = i - 1;
else if (jmin > imax) iMin = i + 1;
else {
if ((len & 1) != 0) return Math.max(imin, jmin);
else return (double)(imin + jmax) / 2;
}
}
throw new RuntimeException("should not be here");
}
}
在这个例子中,如果我们有以下两个数组:
int[] A = {1, 3};
int[] B = {2};
那么合并后的数组是{1, 2, 3}
,中位数应该是2。这个函数可以正确地返回这个结果。