当前位置: 面试刷题>> 寻找两个正序数组的中位数(经典算法150题)


### 题目描述 给定两个按非递减顺序排列的正整数数组 `nums1` 和 `nums2`,请编写一个函数来找到这两个数组合并后的中位数。 函数应该返回合并后数组的中位数,如果合并后数组长度为奇数,则返回正中间的那个元素;如果合并后数组长度为偶数,则返回中间两个元素的平均值。 **注意**: - 你可以假设 `nums1` 和 `nums2` 不会同时为空。 - 两个数组的长度之和不会超过 100。 ### 示例 **示例 1**: ``` nums1 = [1, 3] nums2 = [2] 合并后的数组 = [1, 2, 3] 中位数 = 2 ``` **示例 2**: ``` nums1 = [1, 2] nums2 = [3, 4] 合并后的数组 = [1, 2, 3, 4] 中位数 = (2 + 3) / 2 = 2.5 ``` ### PHP 代码示例 ```php function findMedianSortedArrays($nums1, $nums2) { $merged = array_merge($nums1, $nums2); sort($merged); $n = count($merged); if ($n % 2 == 0) { return ($merged[($n / 2) - 1] + $merged[$n / 2]) / 2; } else { return $merged[floor($n / 2)]; } } // 测试示例 $nums1 = [1, 3]; $nums2 = [2]; echo findMedianSortedArrays($nums1, $nums2); // 输出 2 $nums1 = [1, 2]; $nums2 = [3, 4]; echo findMedianSortedArrays($nums1, $nums2); // 输出 2.5 ``` ### Python 代码示例 ```python def findMedianSortedArrays(nums1, nums2): merged = sorted(nums1 + nums2) n = len(merged) if n % 2 == 0: return (merged[n // 2 - 1] + merged[n // 2]) / 2 else: return merged[n // 2] # 测试示例 nums1 = [1, 3] nums2 = [2] print(findMedianSortedArrays(nums1, nums2)) # 输出 2.0 nums1 = [1, 2] nums2 = [3, 4] print(findMedianSortedArrays(nums1, nums2)) # 输出 2.5 ``` ### JavaScript 代码示例 ```javascript function findMedianSortedArrays(nums1, nums2) { const merged = [...nums1, ...nums2].sort((a, b) => a - b); const n = merged.length; if (n % 2 === 0) { return (merged[Math.floor(n / 2) - 1] + merged[Math.floor(n / 2)]) / 2; } else { return merged[Math.floor(n / 2)]; } } // 测试示例 const nums1 = [1, 3]; const nums2 = [2]; console.log(findMedianSortedArrays(nums1, nums2)); // 输出 2 const nums1_2 = [1, 2]; const nums2_2 = [3, 4]; console.log(findMedianSortedArrays(nums1_2, nums2_2)); // 输出 2.5 ``` 在这些示例中,我们首先合并两个数组,然后对合并后的数组进行排序。根据合并后数组的长度是奇数还是偶数,我们返回相应的中位数。这种方法虽然直观,但在处理大数据集时可能不是最高效的。对于更高效的算法,可以考虑使用二分查找法来避免直接合并和排序整个数组。