Median of Two Sorted Arrays

寻找两个有序数组的中位数
本文介绍了一种在O(log(m+n))的时间复杂度内找到两个有序数组中位数的方法。通过寻找第K小的值来解决该问题,并提供了一个具体的实现方案。

题目描述:

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
这个题就是找第K小的值得问题.

n1=nums1.length,n2=nums2.length。

如果n1+n2为奇数,则取第(n1+n2)/2+1小的值

如果n1+n2为偶数,则取第(n1+n2)/2+1小和第(n1+n2)/2小的值,然后两者相加除以2

这里一个重要的关系是若nums1[k/2]<nums2[k/2],那么nums1[0]~nums1[k/2]肯定在总的第k小数的组里。

代码如下:

public class Solution {
    public static int findKthSmallest(int[] a, int m, int begin1, int[] b, int n, int begin2, int k) {
        if (m > n)
            return findKthSmallest(b, n, begin2, a, m, begin1, k);
        if (m == 0)
            return b[begin2 + k - 1];
        if (k == 1)
            return Integer.min(a[begin1], b[begin2]);
        int partA = Integer.min(k / 2, m), partB = k - partA;
        if (a[begin1 + partA - 1] == b[begin2 + partB - 1])
            return a[begin1 + partA - 1];
        else if (a[begin1 + partA - 1] > b[begin2 + partB - 1])
            return findKthSmallest(a, m, begin1, b, n - partB, begin2 + partB, k - partB);
        else
            return findKthSmallest(a, m - partA, begin1 + partA, b, n, begin2, k - partA);
    }
    
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length, len2 = nums2.length, sumLen = len1 + len2;
        if (sumLen % 2 != 0) {
            return findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2 + 1);
        } else {
            return (findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2)
                    + findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2 + 1)) / 2.0;
        }
    
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值