代码如下:
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的右边放在一起,得到两个集合。
如果我们可以保证左边集合的长度和右边集合的长度相等,而且左边最大的元素小于右边最小的元素,那么我们就可以得到中位数:
为了保证左边集合元素个数和右边集合元素个数相等,我们要确保:
为了保证左边集合的最大元素小于右边集合的最小元素,我们要确保: