方法一
直接将数组合并,新数组的中位数就是所求的值。
时间复杂度:O(m+n)
空间复杂度:O(m+n)
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int []num = new int[m+n];
//如果数组一为空
if(m==0){
//数组二为偶数个,中位数取中间两个的平均值
if(n%2==0){
return (nums2[n/2]+nums2[n/2-1])/2.0;
}else{
//数组二奇数个,中位数为中间位置
return nums2[n/2];
}
}
if(n==0){
if(m%2==0){
return (nums1[m/2]+nums1[m/2-1])/2.0;
}else{
return nums1[m/2];
}
}
int count=0;
int i=0,j=0;
while(count!=(m+n)){
if(i==m){//若遍历完数组一
while(j!=n){//遍历数组二
num[count++]=nums2[j++];
}
break;
}
if(j==n){
while(i!=m){
num[count++]=nums1[i++];
}
break;
}
if(nums1[i]>nums2[j]){//把小的存储在新建数组中
num[count++]=nums2[j++];
}else{
num[count++]=nums1[i++];
}
}
if(count%2==0){
return (num[count/2-1]+num[count/2])/2.0;
}else{
return num[count/2];
}
方法二
不全部遍历,而是遍历到中位数的位置返回结果
奇数个:中位数为第(len+1)/2个,需要遍历len/2+1次。
偶数个:中位数为第len/2和第len/2+1个的平均值,一样需要遍历len/2+1次。
时间复杂度:O(m+n)
空间复杂度:O(1)
public double findMedianSortedArrays2(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int left=-1,right=-1;//使用left保存上一次遍历的值,right保存当前遍历的值
int aStart=0,bStart=0;//aStart为数组1的遍历位置索引,bStart为数组2的遍历索引
int len = m+n;
for (int i = 0; i <= len / 2; i++) { //[0,len/2]-->总共遍历len/2次
left=right;
if(aStart<m&&(bStart>=n||nums1[aStart]<nums2[bStart])){ //遍历数组1的条件:①数组1没遍历完,数组2已遍历完;②数组1没遍历玩且当前位置数组1的值小于数组2
right=nums1[aStart++];
}else{
right=nums2[bStart++];
}
}
if((len&1)==0){
return (left+right)/2.0;
}else{
return right;
}
}