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

105 阅读1分钟

1.题目描述

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的中位数。

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

2.我的解答

思路:先将其合并为一个数组,再判断数组的长度为奇数还是偶数,奇数则最中间的数是中位数,偶数则中间两位是平均数为中位数

 (1)合并为一个数组:

进行一个while(i<nums1.length&&j<nums2.length)循环

创建一个num数组用来保存全部的值

nums1[i]<=nums2[j]为真,则将其赋值给num[m]并且i加一;为假,将nums2[j]赋值给num[m]并且j加一

 通过判断目前i和j与其数组长度的大小来判断哪个已经被全部保存,剩余一个while循环赋值

(2)判断生成的数组的大小

为奇数:(length-1)/2

为偶数: (length-1)/2,length/2的平均数

class Solution {   public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int Numlength=nums1.length+nums2.length;        int[] num=new int[Numlength];        int i=0;        int j=0;        int m=0;        while(i<nums1.length&&j<nums2.length&&m<Numlength){            if(nums1[i]<=nums2[j]){                num[m]=nums1[i];                i++;                m++;            }else{                num[m]=nums2[j];                j++;                m++;            }        }        if(i>=nums1.length){            while(j<nums2.length&&m<Numlength){                num[m]=nums2[j];                m++;                j++;            }        }        if(j>=nums2.length){            while(i<nums1.length&&m<Numlength){                num[m]=nums1[i];                m++;                i++;            }        }        int num1;        int num2;        double temp;        double result=0.0;        if(Numlength%2==1){            num1=num[(Numlength-1)/2];            result=num1;        }        if(Numlength%2==0){            num1=num[(Numlength-1)/2];            num2=num[Numlength/2];            result=num2;            result=(num1+result)/2;        }        return result;    }}

写的时候整数转double出现了问题

当数组的大小为偶数时,需要两个整数进行加减除法,由于是两个整数,因此除出来的依然是整数,需要将一个数组转换为double,然后再进行即可保留小数点后数字

时间复杂度为O(m+n),官方题解的二分查找没太看懂(哭)