package com.cheng.leetcode;
import java.util.ArrayList;
import java.util.List;
/**
* @author c
* @create 2020-12-24 14:26
* 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
* 示例 3:
*
* 输入:nums1 = [0,0], nums2 = [0,0]
* 输出:0.00000
* 示例 4:
*
* 输入:nums1 = [], nums2 = [1]
* 输出:1.00000
* 示例 5:
*
* 输入:nums1 = [2], nums2 = []
* 输出:2.00000
*
*
* 提示:
*
* nums1.length == m
* nums2.length == n
* 0 <= m <= 1000
* 0 <= n <= 1000
* 1 <= m + n <= 2000
* -106 <= nums1[i], nums2[i] <= 106
* 通过次数307,445提交次数782,084
*/
public class Demo0004 {
/*
此方法是将两个数组的内容都添加到集合中
利用集合自带的排序算法来排序,效率较低
*/
public double findMedianSortedArrays1(int[] nums1, int[] nums2) {
float m = nums1.length;
float n = nums2.length;
List<Integer> list = new ArrayList<>();
for (int num : nums1) {
list.add(num);
}
for (int num : nums2) {
list.add(num);
}
list.sort(Integer::compareTo);
float mid = (m + n) / 2;
//总数为单数
if (mid != (int) mid) {
mid = (int) mid + 1;
return list.get((int) mid - 1);
} else {
return (double) (list.get((int) mid - 1) + list.get((int) mid)) / 2;
}
}
/*
本方法使用归并排序,将两个正序数组整合成一个正序数组
*/
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int i = 0, j = 0;
int[] res = new int[m + n];
for (int p = 0; p < m + n; p++) {
if (i == m ) {
res[p] = nums2[j];
j++;
continue;
}
if (j == n ) {
res[p] = nums1[i];
i++;
continue;
}
if (nums1[i] < nums2[j]) {
res[p] = nums1[i];
i++;
} else {
res[p] = nums2[j];
j++;
}
}
//总数为单数
if ((m+n) % 2 == 1) {
return res[(int) (m + n) / 2];
} else {
return (double) (res[(int) ((m + n) / 2 - 1)] + res[(int) ((m + n) / 2)]) / 2;
}
}
public static void main(String[] args) {
int[] num1 = new int[]{1,3};
int[] num2 = new int[]{2};
System.out.println(new Demo0004().findMedianSortedArrays(num1, num2));
}
}
代码优化前
代码优化后