中位数

作者: Ermengarde | 来源:发表于2019-07-24 10:22 被阅读0次

    给定两个大小为 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;

        }

    }

    相关文章

      网友评论

          本文标题:中位数

          本文链接:https://www.haomeiwen.com/subject/gxvtrctx.html