算法-寻找两个有序数组中的中位数
不得不说,此题的确很难 Leetcode-4,作为Leetcode的第一个难题,是很打击人的。
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
本题的难度在于要实现log(n)的时间复杂度,除了二分法,我们没有别的办法。
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1=nums1.length,len2=nums2.length;
if(len1>len2){
return findMedianSortedArrays(nums2,nums1);
}
int k=(len1+len2+1)>>1;
int left=0,right=len1;
while(left<right){
int m1=(left+right)>>1;//中间或者中间靠后的一个元素
int m2=k-m1;
//切分的数组2中的中间或者中间靠后的位置
//假如数组1对应位置的元素小于数组二中对应元素,说明中位数在数组1右侧
if(nums1[m1]<nums2[m2-1]){
left=m1+1;
}else{//否则在左侧
right=m1;
}
}
int m1=left,m2=k-left;
int c1=Math.max(m1<=0?Integer.MIN_VALUE:nums1[m1-1],m2<=0?Integer.MIN_VALUE:nums2[m2-1]);
if((len1+len2)%2==1){
return c1;
}
int c2=Math.min(m1>=len1?Integer.MAX_VALUE:nums1[m1],m2>=len2?Integer.MAX_VALUE:nums2[m2]);
return (c1+c2)*0.5;
}
对此题更详细的讨论,请看这里:Leetcode-04