给定两个大小分别为 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(from LeetCode)
方法一:普通排序查找,将两个数组排成一个数组,时间复杂度为O(m+n),这期间不需要全部排序完,只需要排到中位数即可。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n1=0,n2=0;
double mid;
int length=(nums1.length+nums2.length)/2;
int odd=(nums1.length+nums2.length)%2;
int[] nums3= new int[length+1];
for(int i=0;i<nums3.length;i++){
if(n1>=nums1.length){
nums3[i]=nums2[n2];
n2++;
continue;
}
if(n2>=nums2.length){
nums3[i]=nums1[n1];
n1++;
continue;
}
if(nums1[n1]<=nums2[n2]){
nums3[i]=nums1[n1];
n1++;
}else{
nums3[i]=nums2[n2];
n2++;
}
}
if(odd==1){
mid=nums3[length];
}else{
mid=nums3[length]+nums3[length-1];
mid/=2;
}
return mid;
}
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n1=0,n2=0;
double mid;
int length=(nums1.length+nums2.length)/2;
int odd=(nums1.length+nums2.length)%2;
int[] nums3= new int[length+1];
for(int i=0;i<nums3.length;i++){
if(n1>=nums1.length){
nums3[i]=nums2[n2];
n2++;
continue;
}
if(n2>=nums2.length){
nums3[i]=nums1[n1];
n1++;
continue;
}
if(nums1[n1]<=nums2[n2]){
nums3[i]=nums1[n1];
n1++;
}else{
nums3[i]=nums2[n2];
n2++;
}
}
if(odd==1){
mid=nums3[length];
}else{
mid=nums3[length]+nums3[length-1];
mid/=2;
}
return mid;
}
}
文章评论