LeetCode-Median of Two Sorted Arrays

代码如下:

package com.leetcode.study;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        int[] nums1 = new int[]{1,2};
        int[] nums2 = new int[]{3,4};
        System.out.println(findMedianSortedArrays(nums1, nums2));

    }
    public static double findMedianSortedArrays(int[] nums1,int[]nums2){
        int m = nums1.length;
        int n = nums2.length;
        if(m>n){//保证m<=n
            int[]temp=nums1;nums1=nums2;nums2=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&&nums2[j-1]>nums1[i]){
                iMin = iMin+1;//i is too small
            }else if(i>iMin&&nums1[i-1]>nums2[j]){
                iMax=iMax-1;//i is too big
            }else{
                //i is prefect
                int maxLeft=0;
                if(i==0){
                    maxLeft=nums2[j-1];
                }else if(j==0){
                    maxLeft=nums1[i-1];
                }else{
                    maxLeft=Math.max(nums1[i-1], nums2[j-1]);
                }
                if((m+n)%2==1){
                    return maxLeft;
                }
                int minRight = 0;
                if(i==m){
                    minRight=nums2[j];
                }else if(j==n){
                    minRight=nums1[i];
                }else{
                    minRight=Math.min(nums2[j], nums1[i]);
                }
                return (maxLeft+minRight)/2.0;
            }
        }
        return 0.0;
    }
}

这个有点复杂,看不太懂。

中位数是要把有序的数组分成两个等长的部分。

我们首先把数组A分成两个等长的部分:

数组A公有m个元素,所以公有m+1种分法。

而且我们知道,左边的长度为i,右边的长度为m-i。当i=0时左边是空的,当i=m时,右边是空的。即:

同样的,我们可以对B进行划分:

我们把A的左边和B的左边放在一起,把A的右边和B的右边放在一起,得到两个集合。

如果我们可以保证左边集合的长度和右边集合的长度相等,而且左边最大的元素小于右边最小的元素,那么我们就可以得到中位数:

为了保证左边集合元素个数和右边集合元素个数相等,我们要确保:

为了保证左边集合的最大元素小于右边集合的最小元素,我们要确保:

原文地址:https://www.cnblogs.com/LoganChen/p/8796732.html