【LeetCode算法-04】两个排序数组的中位数 问题

首先,我们需要明确什么是中位数。在一组数据中,中位数是指将这组数据从小到大排列后,处于中间位置的数。如果这组数据的数量是偶数,则中位数是中间两个数的平均值。

接下来我们来看如何用Java实现这个功能。假设我们有两个已经排序好的数组A和B,我们的目标是找到这两个数组合并后的中位数。

  1. 首先,我们可以使用一个变量len来存储两个数组的长度之和。
  2. 然后,我们定义两个指针i和j,分别指向数组A和B的第一个元素。
  3. 接下来,我们需要维护两个指针的位置关系,使得两个指针之间的距离小于或等于len/2(如果len是奇数),或者小于len/2+1(如果len是偶数)。这是因为我们要找的是中位数,所以两个指针之间的元素个数应该尽可能地接近len/2。
  4. 我们通过不断地比较两个指针指向的元素大小,并移动较小的那个指针来达到上述目的。
  5. 当满足条件时,我们就找到了中位数。如果是偶数个元素,那么中位数就是两个指针指向元素的平均值;如果是奇数个元素,那么中位数就是较大的那个指针所指向的元素。

以下是具体的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。这个函数可以正确地返回这个结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值