给定两个大小分别为 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
//将数组排为从小到大的正序
//这里的arr是要被排序的数组
Arrays.sort(arr);
//将数组排位从大到小排序
// 将数组转换为包装类型,使用 Collections.reverseOrder()
Arrays.sort(arr, Collections.reverseOrder());
这里是测试样例
public static void main(String[] args) {
FindTheMiddleOfTwoNumbers findTheMiddleOfTwoNumbers = new FindTheMiddleOfTwoNumbers();
int[] nums1 = {1,2,3};
int[] nums2 = {2, 3, 4};
double median = findTheMiddleOfTwoNumbers.findMedianSortedArrays(nums1, nums2);
System.out.println("Median: " + median);
}
对于中位数的取值逻辑
double TheMedian = 0;//中位数取值初始化
//中位数取值的逻辑
if (n % 2 == 0) {
TheMedian = (mergedArray[n / 2] + mergedArray[(n / 2) - 1]) / 2.00;
}else {
TheMedian = mergedArray[n / 2];
}
return TheMedian;
对于空数组的逻辑处理
//空数组的处理
if (nums1 == null || nums1.length == 0) {
return nums2;
}
if (nums2 == null || nums2.length == 0) {
return nums1;
}
对于两个正序数组的排序逻辑
//nums1和nums2排序的逻辑
int i = 0;
int j = 0;
int index = 0;
while (i < nums1.length && j < nums2.length){
if (nums1[i] < nums2[j]) {
arr[index] = nums1[i];
i++;
}else {
arr[index] = nums2[j];
j++;
}
index++;
}
//当nums1有余项时
while (i < nums1.length){
arr[index] = nums1[i];
++index;
i++;
}
//当nums2有余项时
while (j < nums2.length){
arr[index] = nums2[j];
++index;
j++;
}
return arr;
代码汇总
public class FindTheMiddleOfTwoNumbers {
public static void main(String[] args) {
FindTheMiddleOfTwoNumbers findTheMiddleOfTwoNumbers = new FindTheMiddleOfTwoNumbers();
int[] nums1 = {1,2,3};
int[] nums2 = {2, 3, 4};
double median = findTheMiddleOfTwoNumbers.findMedianSortedArrays(nums1, nums2);
System.out.println("Median: " + median);
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//此处提供mergeArrays方法,用来对nums1,nums2排序
int[] mergedArray = mergeArrays(nums1,nums2);
int n = mergedArray.length;
double TheMedian = 0;//中位数取值初始化
//中位数取值的逻辑
if (n % 2 == 0) {
TheMedian = (mergedArray[n / 2] + mergedArray[(n / 2) - 1]) / 2.00;
}else {
TheMedian = mergedArray[n / 2];
}
return TheMedian;
}
private int[] mergeArrays(int[] nums1, int[] nums2) {
int n1 = nums1.length;
int n2 = nums2.length;
//定义一个数组arr,用来存放排序nums1和nums2的结果
int[] arr = new int[n1 + n2];
//空数组的处理
if (nums1 == null || nums1.length == 0) {
return nums2;
}
if (nums2 == null || nums2.length == 0) {
return nums1;
}
//nums1和nums2排序的逻辑
int i = 0;
int j = 0;
int index = 0;
while (i < nums1.length && j < nums2.length){
if (nums1[i] < nums2[j]) {
arr[index] = nums1[i];
i++;
}else {
arr[index] = nums2[j];
j++;
}
index++;
}
//当nums1有余项时
while (i < nums1.length){
arr[index] = nums1[i];
++index;
i++;
}
//当nums2有余项时
while (j < nums2.length){
arr[index] = nums2[j];
++index;
j++;
}
return arr;
}
}