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

力扣 寻找两个正序数组的中位数

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

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

算法的时间复杂度应该为 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
  • -106 <= nums1[i], nums2[i] <= 106

代码

#include <vector>
#include <algorithm> // 用于min函数
using namespace std;class Solution {
private:// 实现找两个数组中第k小的元素(修正后)int getKthNum(vector<int>& nums1, vector<int>& nums2, int k) {int m = nums1.size();int n = nums2.size();int offset1 = 0; // nums1的起始偏移量int offset2 = 0; // nums2的起始偏移量while (true) {// 若nums1已遍历完,直接返回nums2中第k个元素if (offset1 == m) {return nums2[offset2 + k - 1];}// 若nums2已遍历完,直接返回nums1中第k个元素if (offset2 == n) {return nums1[offset1 + k - 1];}// 若k=1,返回两个数组当前起始位置的较小值if (k == 1) {return min(nums1[offset1], nums2[offset2]);}// 计算本次要比较的位置(避免越界)int index1 = min(offset1 + k / 2 - 1, m - 1);int index2 = min(offset2 + k / 2 - 1, n - 1);// 比较两个位置的值,排除较小部分的元素if (nums1[index1] <= nums2[index2]) {// 排除nums1中offset1到index1的元素,更新k和offset1k -= (index1 - offset1 + 1);offset1 = index1 + 1;} else {// 排除nums2中offset2到index2的元素,更新k和offset2k -= (index2 - offset2 + 1);offset2 = index2 + 1;}}}public:// 主函数:计算两个正序数组的中位数double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int total = nums1.size() + nums2.size();if (total % 2 == 1) {// 总元素为奇数,返回中间的元素(第(total+1)/2小)return getKthNum(nums1, nums2, (total + 1) / 2);} else {// 总元素为偶数,返回中间两个元素的平均值int ret1 = getKthNum(nums1, nums2, total / 2);int ret2 = getKthNum(nums1, nums2, total / 2 + 1);return (ret1 + ret2) / 2.0; // 修正笔误:=改为+}}
};

复杂度分析

每次迭代将k减半,最多执行log(m+n)次,因此时间复杂度为O(log(m+n)),满足题目要求。空间复杂度为O(1),仅使用常量额外空间。

常见疑问

  • 为什么比较k/2的位置?
    这样可以确保每次至少排除k/2个元素,快速缩小问题规模。
  • 如何处理数组越界?
    通过min(offset + k/2 -1, 数组长度-1)确保索引有效。
  • 为何偶数情况要调用两次函数?
    因为中位数由两个数决定,需分别找到第k/2和第k/2+1小的数。
http://www.dtcms.com/a/580927.html

相关文章:

  • 文库类网站建设建议及经验上海高风险区域最新
  • 建设工程自学网站网站建设及管理使用情况汇报
  • Java 多线程同步机制深度解析:从 synchronized 到 Lock
  • AR眼镜在核电操作智能监护应用技术方案|阿法龙XR云平台
  • Rust 练习册 :Nth Prime与素数算法
  • 杭州网站建设机构win7做网站服务器卡
  • 算法基础篇:(三)基础算法之枚举:暴力美学的艺术,从穷举到高效优化
  • 【大模型学习3】预训练语言模型详解
  • 《Linux系统编程之开发工具》【实战:倒计时 + 进度条】
  • 【Frida Android】实战篇1:环境准备
  • 【2025 CVPR】EmoEdit: Evoking Emotions through Image Manipulation
  • 如何创建网站内容网站名称不能涉及
  • 编写微服务api
  • Flutter Transform.rotate 与动画控制器 实现旋转动画
  • Flutter进行命令打包各版本程序(2025.11)
  • 【基于 WangEditor v5 + Vue2 封装 CSDN 风格富文本组件】
  • 网站建设的重要性意义徐州建站公司模板
  • Scrapy源码剖析:下载器中间件是如何工作的?
  • vi 编辑器命令大全
  • AI 预测 + 物联网融合:档案馆温湿度监控系统发展新趋势
  • Vue JSON结构编辑器组件设计与实现解析
  • 14_FastMCP 2.x 中文文档之FastMCP高级功能:MCP中间件详解
  • 软考中级软件设计师(下午题)--- UML建模
  • 机械臂时间最优规划
  • 【LeetCode刷题】两数之和
  • 10 月热搜精选
  • 郑州商城网站开发摄影网站源码 国外
  • Docker 加载镜像时报 no space left on device 的彻底解决方案
  • 5、prometheus标签
  • python+django/flask基于机器学习的就业岗位推荐系统