~/algorithm/

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

#leetcode easy/medium/hard#algorithm#js

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

nums1 = [1, 2];
nums2 = [3, 4];

则中位数是(2 + 3) / 2 = 2.5;

解题思路

由于是两个排好序的数组,所以将两个数组合并,再找中位数就好了。(这难度不像是苦难啊。。)

解法优化

排名第一的思路相同,但由于我使用了shift()方法,导致速度上有所下降,改进为定义两个index,每次向 res 数组添加时,改为index的增加。

代码展示

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
  let len1 = nums1.length;
  let len2 = nums2.length;
  let avg = (len1 + len2) / 2;
  let flg = avg == parseInt(avg);
  avg = parseInt(avg);

  let res = [];
  while (nums1.length != 0 && nums2.length != 0) {
    if (nums1[0] < nums2[0]) {
      res.push(nums1.shift());
    } else if (nums1[0] > nums2[0]) {
      res.push(nums2.shift());
    } else {
      res.push(nums1.shift());
      res.push(nums2.shift());
    }
  }
  res = res.concat(nums1, nums2);
  return flg ? (res[avg] + res[avg - 1]) / 2 : res[avg];
};