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
自己写的,时间复杂度O(m+n)
- 归并,合成一个数组
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int total = m + n;
int z = (m + n) / 2;
double[] arr = new double[m + n];
int i = 0, j = 0, k = 0;
double zhong;
// 如果有一个数组长度为0,不进行数组拼接
if (m == 0) {
if (total % 2 == 0) {
zhong = (nums2[z - 1] + nums2[z]) / 2.0;
} else {
zhong = nums2[z];
}
return zhong;
} else if (n == 0) {
if (total % 2 == 0) {
zhong = (nums1[z - 1] + nums1[z]) / 2.0;
} else {
zhong = nums1[z];
}
return zhong;
} else {
while ((i < m) && (j < n)) {
if (nums1[i] < nums2[j]) {
arr[k] = nums1[i];
k++;
i++;
} else {
arr[k] = nums2[j];
k++;
j++;
}
}
if (nums1[m - 1] < nums2[n - 1]) {
for (; k < total; k++) {
arr[k] = nums2[j];
j++;
}
} else {
for (; k < total; k++) {
arr[k] = nums1[i];
i++;
}
}
if (total % 2 == 0) {
zhong = (arr[z - 1] + arr[z]) / 2.0;
} else {
zhong = arr[z];
}
return zhong;
}
}
}
- 不归并,两个指针,将较小指针后移一位,直到中位数位置
二分查找,时间复杂度:O(log(m+n))
转化成寻找两个有序数组中的第 k 小的数,其中 k为 (m+n)/2 或 (m+n)/2+1
