汪图南
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • 介绍

    • 介绍
  • 推荐

    • LeetCode刷题推荐
  • 链表

    • 目录
    • 简单
    • 中等
    • 困难
  • 栈

    • 目录
    • 简单
    • 中等
    • 困难
  • 队列

    • 目录
    • 简单
    • 中等
    • 困难
  • 哈希表

    • 目录
    • 简单
    • 中等
    • 困难
  • 二叉树

    • 目录
    • 简单
    • 中等
    • 困难
  • 堆

    • 目录
    • 简单
    • 中等
    • 困难
  • 图

    • 目录
    • 简单
    • 中等
    • 困难
  • 搜索

    • 目录
    • 简单
    • 中等
    • 困难

困难

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

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

方法一:暴力合并数组

// m,n分别为两个数组的元素数量
// 时间复杂度:O(m + n)
// 空间复杂度:O(m + n)
var getNumsMid = function (nums) {
  const len = nums.length;
  const mid = Math.floor(len / 2);
  if (len % 2 === 0) {
    return (nums[mid - 1] + nums[mid]) / 2;
  } else {
    return nums[mid];
  }
}
var findMedianSortedArrays = function (nums1, nums2) {
  const m = nums1.length;
  const n = nums2.length;
  if (m === 0) {
    return getNumsMid(nums2);
  }
  if (n === 0) {
    return getNumsMid(nums1);
  }
  let count = 0;
  let i = 0;
  let j = 0;
  let nums = [];
  while (count < (m + n)) {
    // 第一个数组先遍历完毕时
    if (i === m) {
      while (j < n) {
        nums[count++] = nums2[j++];
      }
      break;
    }
    // 第二个数组先遍历完毕时
    if (j === n) {
      while (i < m) {
        nums[count++] = nums1[i++];
      }
      break;
    }
    // 按大小排序
    if (nums1[i] < nums2[j]) {
      nums[count++] = nums1[i++];
    } else {
      nums[count++] = nums2[j++];
    }
  }
  // 在新数组中去中位数
  return getNumsMid(nums);
};

方法二:虚拟合并

// m,n分别为两个数组的元素数量
// 时间复杂度:O(m + n)
// 空间复杂度:O(1)
var findMedianSortedArrays = function (nums1, nums2) {
  const m = nums1.length;
  const n = nums2.length;
  let len = m + n;
  let left = -1;
  let right = -1;
  let aStart = 0;
  let bStart = 0;
  let i = 0;
  while (i <= len / 2) {
    left = right;
    if (aStart < m && (nums1[aStart] < nums2[bStart] || bStart >= n)) {
      right = nums1[aStart++];
    } else {
      right = nums2[bStart++];
    }
    i++;
  }
  if (len % 2 === 0) {
    return (left + right) / 2;
  } else {
    return right;
  }
}

方法三:二分法

// 撰写中。。。
最后更新时间: 2025/5/6 15:36
贡献者: wangtunan
Prev
中等