/**
* 解题思路:合并两个有序数组,然后直接计算中位数
*/
class Solution {
/**
* 查找两个有序数组合并后的中位数
* @param nums1 第一个有序数组(升序)
* @param nums2 第二个有序数组(升序)
* @return 合并后的中位数(double类型)
*/
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
// 获取两个数组的长度
int m = nums1.length; // 数组1的长度
int n = nums2.length; // 数组2的长度
int[] nums = new int[m + n]; // 合并结果数组(容量为两数组长度之和)
int count = 0; // 合并数组的当前填充位置
int i = 0, j = 0; // 双指针:i遍历nums1,j遍历nums2
// 合并两个有序数组的核心逻辑
while (count != (m + n)) { // 当合并数组未填满时循环
// 情况1:nums1已遍历完,直接填充nums2剩余元素
if (i == m) {
nums[count++] = nums2[j++]; // 复制元素并移动指针
}
// 情况2:nums2已遍历完,直接填充nums1剩余元素
else if (j == n) {
nums[count++] = nums1[i++];
}
// 情况3:比较当前元素,选择较小的放入合并数组
else if (nums1[i] < nums2[j]) {
nums[count++] = nums1[i++]; // 选择nums1的元素
} else {
nums[count++] = nums2[j++]; // 选择nums2的元素
}
}
// 计算合并后数组的中位数
if (count % 2 == 0) { // 数组长度为偶数
// 中间两个数的平均值(注意用2.0保证结果为浮点数)
return (nums[count/2 - 1] + nums[count/2]) / 2.0;
} else { // 数组长度为奇数
// 直接返回中间的数
return nums[count/2];
}
}
}