1.题目描述
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
输入: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),官方题解的二分查找没太看懂(哭)