- 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数2
示例2:
输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
代码
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m=nums1.length;
int n=nums2.length;
int k=(m+n)/2;
if((m+n)%2!=0){
return (double)find(nums1,nums2,k+1);
}else{
return ((double)find(nums1, nums2, k) + (double)find(nums1, nums2, k+1)) / 2;
}
}
public int find(int[] nums1,int[] nums2,int k){
if(nums1==null || nums1.length==0){
return nums2[k-1];
}
if(nums2==null || nums2.length==0){
return nums1[k-1];
}
//l1和l2分别记录数组1和数组2中已经排除的元素的个数!!!,那么nums1[l1]和nums2[l2]就是目前
//两个数组中未被排除元素中的第一个元素!!!(注意:这个很重要)
int l1=0,l2=0;
//当k>1时需要排除前k-1个元素
while(k>1){
//index1和index2分别表示数组1和数组2中未被排除元素中第k / 2 - 1个元素
int index1=Math.min(l1+k/2-1,nums1.length-1);
int index2=Math.min(l2+k/2-1,nums2.length-1);
//当数组1中第k / 2 - 1个元素小于数组2中第k / 2 - 1个元素个元素的时候
if(nums1[index1]<nums2[index2]){
k=k-(index1-l1)-1;//排除数组1中前k/2个元素
l1=index1+1;
}else if(nums1[index1]>=nums2[index2]){
k=k-(index2-l2)-1;
l2=index2+1;
}
//当数组1的元素都被排除完之后,直接返回数组2中没有排除元素中的第k个元素!!!
if(l1==nums1.length){
return nums2[l2+k-1];
}
if(l2==nums2.length){
return nums1[l1+k-1];
}
}
//跳出循环,此时k=1
return Math.min(nums1[l1],nums2[l2]);
}
}