力扣网 4 寻找两个正序数组的中位数
题目描述
给定两个大小分别为 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
思路分析
最基本的思路,将两个数组重新排序到一个新的数组里,之后再求这个数组的中位数。
关于中位数的求法:
根据元素个数决定,如果个数为奇数,中间那个就是中位数,如果为偶数,则中间的和前一个元素的平均数就是中位数。
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int j=0;int i=0;int q=0;int k=0;int arr[nums1Size+nums2Size];while(i<nums1Size||j<nums2Size){if(i==nums1Size){q=nums2[j++];//将要存放到新数组里的值先放到q里。}else if(j==nums2Size){q=nums1[i++]; }else if(nums1[i]<nums2[j]){q=nums1[i++];}else{q=nums2[j++];}arr[k++]=q;}int a=nums1Size+nums2Size;double n=0;if(a==1){return arr[a-1];}else{if(a%2==0){int b=a/2;n=(arr[b-1]+arr[b])/2.0;//整除2.0转换为double型}else{int b=a/2;n=arr[b]*1.0;}}return n;}