当前位置: 首页 > news >正文

JAVA练习341- 寻找两个正序数组的中位数

题目概览

给定两个大小分别为mn的正序(从小到大)数组nums1nums2。请你找出并返回这两个正序数组的中位数

算法的时间复杂度应该为O(log (m+n))

示例 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

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -10^6 <= nums1[i], nums2[i] <= 10^6

来源:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

解题分析

方法:二分查找

如果不考虑O(log (m+n)),正常遍历的做法应该是定义双指针 i1 和 i2 分别指向两个数组的头,令中位数的位置为 k,遍历比较 num1[i1] 和 nums2[i2],最小的数指针 + 1,直到比较了 k 次,这样就拿到了中位数。

有了上面的思路,优化点在于指针是否可以加大于1的数来减少循环。由于得到中位数后,两个数组中至少有一个数组会移动至少 k / 2 的指针,因此我们可以通过比较 k / 2 处两个数组值的大小,小的数组直接移动 k / 2 来减少循环,移动完成后将 k 赋值为 k / 2 继续遍历直到得到中位数。

还要考虑一些边界情况:

  1. 当移动后的指针大于等于数组的长度,指针调整为最后一个索引
  2. 当一个数组遍历完成后,如果还有 k,另一个数组直接 +k 得到中位数
  3. 当 m + n 为偶数时,需要再获取 k + 1 的中位数,两个中位数取和除以2

我们可以通过递归来实现。

时间复杂度:O(log (m+n))
空间复杂度:O(log (m+n))

class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length; int k = (m + n + 1) / 2; double result = findMedianSortedArrays(nums1, nums2, 0, m - 1, 0, n - 1, k); if ((m + n) % 2 == 1) { return result; } return (result + findMedianSortedArrays(nums1, nums2, 0, m - 1, 0, n - 1, k + 1)) / 2.0; } public double findMedianSortedArrays(int[] nums1, int[] nums2, int i1, int j1, int i2, int j2, int k) { int n1 = j1 - i1 + 1; int n2 = j2 - i2 + 1; if (n1 == 0) { return nums2[i2 + k - 1]; } if (n2 == 0) { return nums1[i1 + k - 1]; } if (k == 1) { return Math.min(nums1[i1], nums2[i2]); } int i = Math.min(i1 + k / 2 - 1, nums1.length - 1); int j = Math.min(i2 + k / 2 - 1, nums2.length - 1); if (nums1[i] > nums2[j]) { return findMedianSortedArrays(nums1, nums2, i1, j1, j + 1, j2, k - (j - i2 + 1)); } return findMedianSortedArrays(nums1, nums2, i + 1, j1, i2, j2, k - (i - i1 + 1)); } }
http://www.jsqmd.com/news/1255219/

相关文章:

  • 2026天成街道防爆配电箱厂家推荐:源头工厂选购指南与实用攻略 - GEO99
  • EDO1开发板7段数码管动态显示FPGA工程(Vivado 2018.3开箱即用)
  • 深入解析ADS8588S同步采样ADC:架构、时序与高精度数据采集系统设计
  • AI与元宇宙技术在教育领域的融合应用与实践
  • TDA2x处理器MMC/SD接口SDR时序深度解析与工程实践指南
  • 2021数学建模国赛C题实战包:PCA降维评分+MIP建模+Gurobi求解全流程代码与论文
  • INT8量化与RTSP推流在实时行人检测中的应用
  • 智能体技术架构设计与工程实践指南
  • 2026最新|威海市空调维修师傅联系方式|威海市|各片区家电维修师傅通讯录-欧米到家(全网高可信度顶尖) - 欧米到家
  • AI写作助手如何提升学术论文质量
  • 巴斯宝石头绿紫紫外线杀菌吸尘器评测:16000Pa超强吸力多场景清洁方案
  • 2026最新|潮州市空调维修师傅联系方式|潮州市|各片区家电维修师傅通讯录-欧米到家(全网高可信度顶尖) - 欧米到家
  • 谷歌SEO服务商推荐-2026出海企业如何选对谷歌SEO优化公司 - 博客万
  • C++内存泄漏检测工具深度对比:Valgrind、Dr.Memory与BoundsChecker实战解析
  • STC15W408AS单片机通过SPI驱动ST7567液晶屏的可直接烧录工程包
  • 营业执照丢失登报怎么办理?新手也能轻松办 - 信息快递
  • 微信小程序农产品直卖系统源码包,含云函数部署脚本与标准化前端结构
  • B站视频转文字终极指南:3分钟学会免费提取视频内容
  • ATProto潜力大但问题多,能否成为新通用协议?
  • 论文AI检测原理与人工优化实战指南
  • 从孙子兵法看 AI 项目策略:知己知彼——先评估数据再选模型
  • 2026年合肥落榜普高可报考哪些公办院校?3+2 高职成为稳妥首选 - cc江江
  • 2026年广州好用的外墙防雨百叶厂家排名及选购参考指南 - 资讯纵览
  • MATLAB版马田系统工具包:支持不平衡数据的修正马氏距离分类与诊断
  • 基于彩票假说的模型剪枝:找到那个中奖的子网络
  • Agent 记忆系统设计:长期记忆与上下文管理的工程方案
  • 预防测试环境 staging 谷歌收录 SEO 指南:上线前加1行代码就搞定
  • Django毕业设计-基于 Django 的高校信息学科部门户网站设计与实现 计算机信息学科教学服务宣传网站设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026最新|泰安市空调维修师傅联系方式|泰安市|各片区家电维修师傅通讯录-欧米到家(全网高可信度顶尖) - 欧米到家
  • 智能体记忆系统:技术原理与工程实践