一、题目
寻找两个正序数组的中位数
给定两个大小分别为 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
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
二、解题思路
1、我们需要对两个数组进行合并 可以使用List集合或者重新开拓一个数组**(数组的长度为两个数组长度之和)。
2、排序,这里可以用的方法很多,如果上面使用的是List集合,这里我们可以使用Collections.sort(待排序的集合名);
对集合进行排序。 如果使用的是数组我们可以使用Arrays.sort(待排序数组名);
3、找出中位数,定义一个double类型**的变量用来接受。这时候我们需要判断数组或者是容器的长度为奇数还是偶数,如果是奇数,则直接/2找到中间的数即可。如果是偶数则需要,找出中间的两个数(数组长度/2找出第一个,先将数组长度 - 1然后再 / 2找出第二个),将两个数进行 / 2 后将其输出。
三、代码如下
package LeetCood;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
*/
public class 寻找两个正序数组的中位数 {
public static void main(String[] args) {
int[] nums1 = new int[]{1, 2};
int[] nums2 = new int[]{3, 4};
Solution solution = new Solution();
System.out.println(solution.findMedianSortedArrays(nums1, nums2));
}
}
/**
* 先合并两个数组 排序 然后找出中位数 这里要判断数组长度是奇数还是很偶数
*/
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] newNums = new int[nums1.length + nums2.length];
for (int count = 0; count < nums1.length; count++) { //复制第一个数组
newNums[count] = nums1[count];
}
for (int count = nums1.length, i = 0; count < newNums.length; count++, i++) { //复制第二个数组
newNums[count] = nums2[i];
}
double x = 0.0;
Arrays.sort(newNums); //进行排序
if (newNums.length % 2 == 0) { //数组长度是偶数
x = (newNums[newNums.length / 2] + newNums[(newNums.length - 1) / 2]) / 2.0; //注意这里是2.0
return x;
} else { //数组长度是奇数
x = newNums[(newNums.length >> 1)];
return x;
}
}
}