寻找两个正序数组的中位数
一、题目及要求
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3] nums2 = [2]
则中位数是 2.0示例 2:
nums1 = [1, 2] nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5。
二、题目分析
(1)理解题意
- 这道题给定了两个数组,要求求其中位数,我采取的方法时将两个数组合并为一个ArrayList集合,然后对集合采取操作。
- 合并数组的方式我们采取循环将数组内的元素遍历,然后使用创建的list集合中的 add() 方法进行添加。
- 然后使用list集合中的sort方法将集合排序(从小大大)
- 接着判断使用 list.size() 方法判断集合的长度,得到集合的长度后,我们判断他的奇偶性,如果是奇数那么采用 list.get((list.size()-1)/2) 方法得到中位数,如果是偶数,则先求出 list.size()/2 的值,然后使用 list.get() 方法获取 list.size()/2 为索引 的数,以及索引为 list.size()/2-1 的数(注:这里获取出来的数的类型都为 Integer 类型,为什么第二个数的索引要-1呢?原因很简单,集合索引的开始为0)。
(2)具体操作
- 创建集合,并将数组中的元素添加进list集合中。
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums1.length; i++) {
list.add(nums1[i]);
}
for (int j = 0; j < nums2.length; j++) {
list.add(nums2[j]);
}
- 使用 sort() 方法对list集合进行排序。
list.sort(Integer::compareTo);
- 判断集合长度的奇偶性,并计算中位数(注意强转,integer计算完后还是interger类型的)
double b= 0 ;
if (list.size()%2==0){
int num = list.size()/2;
Integer integer = list.get(num-1);
Integer integer1 = list.get(num);
//注意强转
b = (double) (integer+integer1)/2;
}else {
b= list.get((list.size()-1)/2);
}
return b;
三、完整代码
import java.util.ArrayList;
public class Test5 {
public static void main(String[] args) {
int[] num1 = {1,3};
int[] num2 = {2,4};
double m = findMedianSortedArrays(num1, num2);
System.out.println(m);
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums1.length; i++) {
list.add(nums1[i]);
}
for (int j = 0; j < nums2.length; j++) {
list.add(nums2[j]);
}
list.sort(Integer::compareTo);
System.out.println(list);
double b= 0 ;
if (list.size()%2==0){
int num = list.size()/2;
Integer integer = list.get(num-1);
Integer integer1 = list.get(num);
b = (double) (integer+integer1)/2;
}else {
b= list.get((list.size()-1)/2);
}
return b;
}
}
四、代码缺陷
- 该代码会在运行速度上会有所欠缺,毕竟采取的是for循环遍历数组添加元素,一旦数组元素过多,就会很耗时。希望大家能帮助我改进代码,欢迎大家来交流!