寻找两个正序数组的中位数
题目描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的中位数。
实例:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
我的解题思路:
首先注意到,给定的两个数值是有序的。我们知道,中位数是处于有序数字中间的数字,可能是一个数,也可能是两个数的算数平均数。所以最直接的方法有两步:
- 将两个有序数组合并成一个大有序数字,由于不知道容量,可以用List.
- 将合并了两个数组的list中的中位数找出。判断合并后有多少个数,判读奇数偶数,确定中位数。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int i = 0;
int j = 0;
//将两个有序数组合并
ArrayList<Integer> list = new ArrayList<>();
while (i< nums1.length && j < nums2.length) {
if (nums1[i] >= nums2[j]) {
list.add(nums2[j++]);
}else {
list.add(nums1[i++]);
}
}
//处理两个数组长度不一致的问题
while (i < nums1.length) {
list.add(nums1[i++]);
}
while (j < nums2.length) {
list.add(nums2[j++]);
}
int size = list.size();
//判断合并后长度奇数偶数和零的情况
if (size % 2 == 0) {
if (size == 0) {
return 0.0;
}
return (list.get(size/2 -1) + list.get(size/2))/2.0;
}else {
return list.get(size/2);
}
}
}
这个算法,的时间复杂度是O(m+n),空间复杂度也是O(m+n)