两个排序数组的中位数

Leetcode练习记录


题目:

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

示例 1:

input:nums1=[1,3],nums2=[2]   output:2.0

示例 2:

input:nums1=[1,2],nums2=[3,4]   output:(2+3)/2.0=2.5


将两个数组中的值按照大小赋值给一个新建数组nums,使用num判断元素个数为奇数还是偶数,使用no定位新建数组nums的中位数,对两数组同时进行扫描,用mid扫描新建数组nums,标志i与j分别数组nums1和nums2,若nums1[i]的值小于nums2[j]的值,则将较小的元素赋值给nums,同时指向该数组的标志后移,若有一数组扫描完毕,另一数组还未结束,则将未结束数组中剩余的元素赋值给nums数组,完成比较,时间复杂度为:nums1与nums2 数组各扫描一次,故时间复杂度为两者长度之和,即O(log(m+n))


class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length1=nums1.length;
        int length2=nums2.length;
        int[] nums=new int[length1+length2];
        int num=(length1+length2)%2;
        int no=(length1+length2)/2;
        double result=0.0;
        //使用mid记录中位数的位置
        int mid=0;
        int i=0,j=0;
        while(i<length1||j<length2){
            if(i<length1&&j<length2){
            if(nums1[i]<nums2[j]){
                nums[mid]=nums1[i];
                i++;
                mid++;
            }else if(nums1[i]>nums2[j]){
                nums[mid]=nums2[j];
                j++;
                mid++;
            }else {
                nums[mid]=nums1[i];
                i++;mid++;
                nums[mid]=nums2[j];
                j++;mid++;
            }
        }else if(i==length1&&j<length2){
                nums[mid]=nums2[j];
            j++;
            mid++;
        }else if(i<length1&&j==length2){
            nums[mid]=nums1[i];
            i++;
            mid++;
        }
    }
        
    if(num==1){
        //奇数个
        result=nums[no];
    }else {
        //偶数个
        result=(nums[no-1]+nums[no])/2.0;
    }
    return result; 
    }
}



要注意返回Result值为Double类型,在除的时候,应该除以2.0,若除以2则会变成整形除法,得到取整之后的值。

有问题还请指出哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值