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

给定两个大小分别为 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
 

提示:nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

思路:这个题思路是较简单的,就是编程时考虑的情况有点多。比如两个数组的长度加起来等于1的时候,或者一个数组的数全都比另一个数组的数小或大的时候。

我一开始没有考虑到一个数组的数全都比另一个数组的数小或大的情况,所以编译出错造成数组越界异常了。

代码:(自己写的)

package text11;
public class Solution {
	public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        double result=0;
        
        int l1=nums1.length;
        int l2=nums2.length;
        int i=0,j=0;
        if(l1+l2==1) {
        	if(l1==1) {
        		result=nums1[0];
        	}else {
        		result=nums2[0];
        	}
        }
        else 
        {
        int aa=(l1+l2)/2+1;
        int[] arr=new int[aa];
        int pos=0;
        for(pos=0;pos<=aa-1;pos++) {
        	if(i==l1) {
        		arr[pos]=nums2[j];
        		j++;
        	}
        	else if(j==l2) {
        		arr[pos]=nums1[i];
        		i++;
        	}
        	else {
        		     
        		if(nums1[i]<nums2[j]) {
        			arr[pos]=nums1[i];
        			i++;  		
        		}
        		else {
        		arr[pos]=nums2[j];
        		j++;
        		}
        	}
        		
        }
       // System.out.print(arr[1]);
        //System.out.print(arr[2]);
        if((l1+l2)%2==1)//如果是奇数
        {
        	result=arr[aa-1];
        }else 
        {
        	result=(arr[aa-2]+arr[aa-1])/2.0;
        }
        }
        return result;
    }
	
	

    public static void main(String args[]) {
    	int[] num1 = new int[] {1,2};
    	int[] num2 = new int[] {3,4};
    	
    	double result= findMedianSortedArrays(num1,num2);
    	System.out.print(result);
    	
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值