4. 寻找两个正序数组的中位数
查看题目困难
数组
中频
解法一:二分查找
时间复杂度:O(log(min(m,n))) | 空间复杂度:O(1) | 推荐使用
动画演示
两个有序数组
数组1
1
3
数组2
2
分割点
数组1分割点: 0
1
3
数组2分割点: 0
2
中位数结果
0
操作日志
代码实现
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
// 确保nums1是较短的数组,以减少二分查找的次数
if (nums1.length > nums2.length) {
return findMedianSortedArrays(nums2, nums1);
}
int m = nums1.length;
int n = nums2.length;
int low = 0;
int high = m;
while (low <= high) {
// 在nums1中进行二分查找
int i = (low + high) / 2;
// 计算nums2中的分割点
int j = (m + n + 1) / 2 - i;
// 边界值处理
int maxLeft1 = (i == 0) ? Integer.MIN_VALUE : nums1[i - 1];
int minRight1 = (i == m) ? Integer.MAX_VALUE : nums1[i];
int maxLeft2 = (j == 0) ? Integer.MIN_VALUE : nums2[j - 1];
int minRight2 = (j == n) ? Integer.MAX_VALUE : nums2[j];
// 检查是否找到正确的分割点
if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
// 计算中位数
if ((m + n) % 2 == 0) {
return (Math.max(maxLeft1, maxLeft2) + Math.min(minRight1, minRight2)) / 2.0;
} else {
return Math.max(maxLeft1, maxLeft2);
}
} else if (maxLeft1 > minRight2) {
// 分割点太靠右,向左移动
high = i - 1;
} else {
// 分割点太靠左,向右移动
low = i + 1;
}
}
// 如果输入不合法,返回0
return 0.0;
}
}时间复杂度:O(log(min(m,n)))
空间复杂度:O(1)