中位数

2019-07-24  本文已影响0人  Ermengarde

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

示例 1:

nums1 = [1, 3]

nums2 = [2]

中位数是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

中位数是 (2 + 3)/2 = 2.5

/**

* Median of Two Sorted Arrays

* 两个排序数组的中位数

*/

class Solution {

    public double findMedianSortedArrays(int[] A, int[] B) {

        int m = A.length;

        int n = B.length;

        if (m > n) { // to ensure m<=n

            int[] temp = A; A = B; B = temp;

            int tmp = m; m = n; n = tmp;

        }

        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;

        while (iMin <= iMax) {

            int i = (iMin + iMax) / 2;

            int j = halfLen - i;

            if (i < iMax && B[j-1] > A[i]){

                iMin = iMin + 1; // i is too small

            }

            else if (i > iMin && A[i-1] > B[j]) {

                iMax = iMax - 1; // i is too big

            }

            else { // i is perfect

                int maxLeft = 0;

                if (i == 0) { maxLeft = B[j-1]; }

                else if (j == 0) { maxLeft = A[i-1]; }

                else { maxLeft = Math.max(A[i-1], B[j-1]); }

                if ( (m + n) % 2 == 1 ) { return maxLeft; }

                int minRight = 0;

                if (i == m) { minRight = B[j]; }

                else if (j == n) { minRight = A[i]; }

                else { minRight = Math.min(B[j], A[i]); }

                return (maxLeft + minRight) / 2.0;

            }

        }

        return 0.0;

    }

}

上一篇 下一篇

猜你喜欢

热点阅读