leetcode4.寻找两个正序数组中的中位数

leetcode4.寻找两个正序数组中的中位数_第1张图片

思路源于

LeetCode004-两个有序数组的中位数-最优算法代码讲解

 基本思路是将两个数组看成一个数组,然后划分为两个部分,若为奇数左边部分个数多1,若为偶数左边部分等于右边部分个数。i表示数组1划分位置(i为4是索引4也表示i的左半部分有四个元素),j表示数组2的划分位置,i和j的划分保证左边部分的所有值都不超过右边部分的最小值,这样中位数就在i和j的附近,与i、j、i-1、j-1这四个位置上的元素有关。若总长度为奇数,则结果为左部分的最大值,若为偶数则结果为左部分的最大值和右边部分的最小值取均值

这道题目的边界条件很难判定,建议多加思索

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if(nums1.length>nums2.length)
            return findMedianSortedArrays(nums2, nums1);
        int m = nums1.length, n = nums2.length;
        int iMin = 0, iMax = m;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;//数组1的分割点
            int j = (m + n + 1) / 2 - i;//数组2的分割点
            if (j!=0&&i!=m &&nums1[i] < nums2[j - 1]) {
                iMin = i + 1;
            } else if (i!=0&&j!=n && nums1[i - 1] > nums2[j]) {
                iMax = i - 1;
            } else {
                int maxOfLeft;
                if(i==0)
                    maxOfLeft=nums2[j-1];
                else if(j==0)
                    maxOfLeft=nums1[i-1];
                else
                    maxOfLeft = Math.max(nums1[i - 1], nums2[j - 1]);

                if((m+n)%2==1)
                    return maxOfLeft;

                int minOfRight;
                if(i==m)
                    minOfRight=nums2[j];
                else if(j==n)
                    minOfRight = nums1[i];
                else
                    minOfRight = Math.min(nums1[i], nums2[j]);
                return (maxOfLeft + minOfRight) / 2.0;
            }
        }
        return 0;
    }
}

 

你可能感兴趣的:(java,算法,数据结构,leetcode,二分查找)