给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的中位数(没有实现题目要求时间复杂度为 O(log (m+n))
的算法,先写写记录一下,再瞅瞅大佬们的)。
package Leetcode;
public class findMedian {
public static void main(String[] args){
findMedian obj = new findMedian();
int[] num1 = {1, 2};
int[] num2 = {3, 4};
System.out.println(obj.findMedianSortedArrays(num1, num2));
}
//返回中位数,直接调用下面写的函数
public double findMedianSortedArrays(int[] nums1, int[] nums2){
if(nums1.length == 0){
return Median(nums2);
}else if(nums1.length == 0){
return Median(nums1);
}else{
int[] num = combineList(nums1, nums2);
return Median(num);
}
}
//返回中位数的函数
public double Median(int[] num){
int len = num.length;
//偶数取中间两个的平均值
if(len % 2 == 0){
return (double)(num[len/2 - 1] + num[len/2])/2.0;
}else{
//奇数取中间的数
return num[len/2];
}
}
//合并两个有序数组
public int[] combineList(int[] num1, int[] num2){
int m = num1.length;
int n = num2.length;
int a = 0;
int b = 0;
//申请新的数组,大小为需要合并的两个数组大小之和
int[] num3 = new int[m + n];
for(int i = 0;i < num3.length;i++){
if(a < m && b < n){
if(num1[a] <= num2[b]){
num3[i] = num1[a];
a++;
}else{
num3[i] = num2[b];
b++;
}
}else if(a < m){
//这里指只满足a小于m,不满足另一个条件,即num2数组取完,只剩下num1
num3[i] = num1[a];
a++;
}else if(b < n){
//这里指只满足b小于n,不满足另一个条件,即num1数组取完,只剩下num2
num3[i] = num2[b];
b++;
}
}
return num3;
}
}
需要多瞅瞅大神的解法。。