4.寻找两个正序数组的中位数

/**
 * 解题思路:合并两个有序数组,然后直接计算中位数
 */
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];  
        }
    }
}
posted @ 2025-05-17 10:47  星星永远发着光  阅读(13)  评论(0)    收藏  举报