题目
题目来源:力扣(LeetCode)
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
 
示例 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
思路分析
var findMedianSortedArrays = function (nums1, nums2) {// nums1长度比nums2小if (nums1.length > nums2.length) {[nums1, nums2] = [nums2, nums1];}let m = nums1.length;let n = nums2.length;// 在0~m中查找let left = 0;let right = m;// median1:前一部分的最大值// median2:后一部分的最小值let median1 = 0;let median2 = 0;while (left <= right) {// 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]// 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]const i = left + Math.floor((right - left) / 2);const j = Math.floor((m + n + 1) / 2) - i;const maxLeft1 = i === 0 ? -Infinity : nums1[i - 1];const minRight1 = i === m ? Infinity : nums1[i];const maxLeft2 = j === 0 ? -Infinity : nums2[j - 1];const minRight2 = j === n ? Infinity : nums2[j];if (maxLeft1 <= minRight2) {median1 = Math.max(maxLeft1, maxLeft2);median2 = Math.min(minRight1, minRight2);left = i + 1;} else {right = i - 1;}}return (m + n) % 2 == 0 ? (median1 + median2) / 2 : median1;};
