[LeetCode-JAVA] Median of Two Sorted Arrays

题目:

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)).

思路:题目大意是找到两个数组的中位数,查了下相关定义,计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。

分享下网上很简洁思路的算法,找两个数组中第k小元素,该方法的核心是将原问题转变成一个寻找第k小数的问题(假设两个原序列升序排列),这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的问题,原问题也得以解决。

首先假设数组A和B的元素个数都大于k/2,我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k/2小的元素和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。如果A[k/2-1]<B[k/2-1],这表示A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。

代码:

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;

        int total = len1 + len2;
        if(total % 2 == 1)
            return findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1);
        else
            return (findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2) 
                    + findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1)) / 2;
    }
    
    public double findKth(int[] a, int astart, int aend, int[] b, int bstart, int bend, int k){
        int m = aend - astart + 1;
        int n = bend - bstart + 1;
        if(m > n)  //时刻保持a为最短 方便后续判断
            return findKth(b, bstart, bend, a, astart, aend, k);
        if(m == 0)  //当有一个数组为空时  
            return b[bstart + k-1];  // 第k小的
        if(k == 1) //找最小的
            return Math.min(a[astart], b[bstart]);
            
        int da = Math.min(k/2, m);   //当m的长度不足k时,需要整个的a数组
        int db = k - da;
        
        if(a[astart + da - 1] < b[bstart + db - 1]){
            return findKth(a, astart+da, aend, b, bstart, bend, k - da);
        }else if(a[astart + da - 1] > b[bstart + db - 1]){
            return findKth(a, astart, aend, b, bstart+db, bend, k - db);
        }else{
            return a[astart + da - 1];
        }
    }
}

参考链接: http://blog.csdn.net/yutianzuijin/article/details/11499917/

      http://www.cnblogs.com/springfor/p/3861890.html

原文地址:https://www.cnblogs.com/TinyBobo/p/4552918.html