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

news2025/1/18 8:49:37

题目链接

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

题目描述

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

算法的时间复杂度应该为 O ( l o g ( m + n ) ) O(log (m+n)) 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

提示:
  • n u m s 1. l e n g t h = m nums1.length = m nums1.length=m
  • n u m s 2. l e n g t h = n nums2.length = n nums2.length=n
  • 0 ≤ m ≤ 1000 0 \leq m \leq 1000 0m1000
  • 0 ≤ n ≤ 1000 0 \leq n \leq 1000 0n1000
  • 1 ≤ m + n ≤ 2000 1 \leq m + n \leq 2000 1m+n2000
  • − 1 0 6 ≤ n u m s 1 [ i ] , n u m s 2 [ i ] ≤ 1 0 6 -10^6 \leq nums1[i], nums2[i] \leq 10^6 106nums1[i],nums2[i]106

解法:二分

我们设 n u m s 1 , n u m s 2 nums1 , nums2 nums1,nums2 的元素个数分别为 m , n m,n m,n

由于我们是要找中位数,所以我们只需要找中间那个数,也就是第 ( m + n + 1 ) / 2 (m+n+1)/2 (m+n+1)/2个数。

我们令 k = ( m + n + 1 ) / 2 k = (m + n + 1) / 2 k=(m+n+1)/2

由于 n u m s 1 , n u m s 2 nums1 , nums2 nums1,nums2 是排好序的,也就是我们要从这两个排好序的数组中,找出第 k k k 小的元素

假设我们从 n u m s 1 nums1 nums1 中选出前 m 1 m_1 m1 个元素,那么就要从 n u m s 2 nums2 nums2 中选出前 m 2 = k − m 1 m_2 = k - m_1 m2=km1 个元素。

如果我们在 n u m s 1 nums1 nums1 中确定了前 m 1 m_1 m1 个元素,那么 m 2 m_2 m2 自然也确定了。

此时我们就可以使用二分,枚举从 n u m s 1 nums1 nums1 中选出元素个数 m 1 m_1 m1

初始时 l = 0 , r = m l = 0 , r = m l=0,r=m

此时 m 1 m_1 m1 确定了 ,那么 m 2 = k − m 1 m_2 = k - m_1 m2=km1 自然也确定了,我们就进行如下判断:

在这里插入图片描述

1.如果 n u m s 1 [ m 1 ] < n u m s 2 [ m 2 − 1 ] nums1[m_1] < nums2[m_2-1] nums1[m1]<nums2[m21]

那么在 n u m s 1 nums1 nums1 中比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小的元素最多有 n u m s 1 [ 0 ] , n u m s 1 [ 1 ] , n u m s 1 [ 2 ] , . . . , n u m s 1 [ m 1 − 1 ] nums1[0],nums1[1],nums1[2],...,nums1[m_1-1] nums1[0],nums1[1],nums1[2],...,nums1[m11],一共有 m 1 m_1 m1 个。

那么在 n u m s 2 nums2 nums2 中比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小的元素最多有 n u m s 2 [ 0 ] , n u m s 2 [ 1 ] , n u m s 2 [ 2 ] , . . . , n u m s 2 [ m 2 − 2 ] nums2[0],nums2[1],nums2[2],...,nums2[m_2-2] nums2[0],nums2[1],nums2[2],...,nums2[m22],一共有 m 2 − 1 m_2 - 1 m21 个。

所以一共有 m 1 + m 2 − 1 = k − 1 m_1 + m_2 - 1 = k - 1 m1+m21=k1 个元素比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小,所以左侧 n u m s 1 [ 0 ] , n u m s 1 [ 1 ] , n u m s 1 [ 2 ] , . . . , n u m s 1 [ m 1 − 1 ] nums1[0],nums1[1],nums1[2],...,nums1[m_1-1] nums1[0],nums1[1],nums1[2],...,nums1[m11] 都不可能是第 k k k 个元素,故 l = m 1 + 1 l = m_1 + 1 l=m1+1

2.如果 n u m s 1 [ m 1 ] ≥ n u m s 2 [ m 2 − 1 ] nums1[m_1] \geq nums2[m_2-1] nums1[m1]nums2[m21]

那么在 n u m s 1 nums1 nums1 中比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小的元素最多有 n u m s 1 [ 0 ] , n u m s 1 [ 1 ] , n u m s 1 [ 2 ] , . . . , n u m s 1 [ m 1 − 1 ] nums1[0],nums1[1],nums1[2],...,nums1[m_1-1] nums1[0],nums1[1],nums1[2],...,nums1[m11],一共有 m 1 m_1 m1 个。

那么在 n u m s 2 nums2 nums2 中比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小的元素最多有 n u m s 2 [ 0 ] , n u m s 2 [ 1 ] , n u m s 2 [ 2 ] , . . . , n u m s 2 [ m 2 − 2 ] , n u m s 2 [ m 2 − 1 ] nums2[0],nums2[1],nums2[2],...,nums2[m_2-2],nums2[m_2-1] nums2[0],nums2[1],nums2[2],...,nums2[m22],nums2[m21],一共有 m 2 m_2 m2 个。

所以一共有 m 1 + m 2 = k m_1 + m_2 = k m1+m2=k 个元素比 n u m s 1 [ m 1 ] nums1[m_1] nums1[m1] 小,所以当前 n u m s 1 [ m 1 − 1 ] nums1[m_1 - 1] nums1[m11],可以作为第 k k k 个元素,所以 r = m 1 r = m_1 r=m1

时间复杂度: O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n))

C++代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size() , n = nums2.size();

        //我们枚举的一定是元素个数少的那个数组,否则会数组越界
        if(m > n) return findMedianSortedArrays(nums2,nums1);

        int k = (m + n + 1) / 2;

        int l = 0 , r = m;
        while(l < r){
            int m1 = (l + r)>>1;
            int m2 = k - m1;
            if(nums1[m1] < nums2[m2 - 1]){
                l = m1 + 1;
            }
            else r = m1;
        }

        int m1 = l , m2 = k - l;
        //针对如下的特殊情况需要特判
        /* 
           5 6 7
           1 2 3 4
           
           1 2 3
           4 5 6 7
        */
        int a = max(m1 <= 0 ? -1e9:nums1[m1 - 1],m2 <= 0 ? -1e9 : nums2[m2 - 1]);
        if((m + n) & 1) return a;
        int b = min(m1 >= m ? 1e9 : nums1[m1],m2 >= n ? 1e9 : nums2[m2]);

        return (a + b) / 2.0;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pinia学习-存储数据、修改数据以及持久化实现

Pinia是什么&#xff1f; Pinia 是 Vue 的存储库&#xff0c;实现全局变量的定义 这里定义的变量信息&#xff0c;任何页面都可以使用&#xff0c;代替原来的VueX 官网&#xff1a;https://pinia.web3doc.top/ 4.2 Pinia存储数据 4.2.1获取存储数据 实现步骤&#xff1a;…

比例夹管阀及其高精度压力和流量控制解决方案

摘要&#xff1a;针对卫生和无菌流体系统中柔性管路内的压力和流量控制&#xff0c;本文介绍了采用电控夹管阀的高精度控制解决方案。解决方案基于反馈控制原理&#xff0c;采用压力传感器或流量传感器进行测量并反馈给程序控制器&#xff0c;控制器驱动夹管阀来改变柔性管路的…

双目视觉实战--单视图测量方法

目录 一.简介 二、2D变换 1. 等距变换&#xff08;欧式变换&#xff09; 2. 相似变换 3. 仿射变换 4. 射影变换&#xff08;透视变换&#xff09; 5. 结论 三、影消点与影消线 1. 平面上的线 2. 直线的交点 3. 2D无穷远点 4. 无穷远直线 5. 无穷远点的透视变换与仿…

Yakit单兵作战神器简单使用

文章目录 免配置抓包破解编码数据包DNSLog 官网下载地址&#xff1a;https://yaklang.com/ 使用文档&#xff1a;https://www.yaklang.com/products/intro 免配置抓包 会启动一个和BurpSuite一样的内置浏览器 访问地址&#xff0c;就会拦截到数据包 也可以在history里查看 破解…

屏幕录制视频编辑软件 Camtasia 2023 mac中文版软件功能

Camtasia 2023 mac是一款功能强大的屏幕录制和视频编辑软件&#xff0c;可以用于制作教育课程、演示文稿、培训视频等。它具有一系列工具和功能&#xff0c;包括屏幕录制、视频编辑、音频编辑、字幕、特效等&#xff0c;使用户可以轻松地创建高质量的视频内容。 Camtasia2023的…

DH48WK 温控器参数设置

北京东昊力伟科技有限责任公司 温控仪、温度控制器 产品特点&#xff1a; 可外接温度传感器Pt100、Cu50、K、E、J、N、T、R、S、B兼容输入&#xff1b;PID控制输出、位式控制输出、继电器报警输出&#xff1b;控温能满足设定温度值的0.2℃&#xff1b;既可用于加热控制、也可…

VR数字政务为我们带来了哪些便捷之处?

每每在政务大厅排队的时候&#xff0c;总是在想未来政务服务会变成什么样子呢&#xff1f;会不会变得更加便捷呢&#xff1f;今天我们就来看看VR数字政务&#xff0c;能够为我们带来哪些便捷之处吧&#xff01; 传统的政务服务中&#xff0c;不仅办事流程复杂&#xff0c;而且每…

5.2 加载矢量图层(delimitedtext,spatialite,wfs,memory)

文章目录 前言加载矢量(vector)图层delimitedtextQGis导入CSV代码导入 SpatiaLite data provider (spatialite)QgsDataSourceUriQGis导入spatialite代码导入 Web服务WFS (web feature service) data provider (wfs)QGis添加图层代码添加 Memory data providerType (memory)QGis…

腾讯云服务器带宽下载速度快吗?多线BGP和CN2高速网络

腾讯云服务器公网带宽下载速度计算&#xff0c;1M公网带宽下载速度是128KB/秒&#xff0c;5M带宽下载速度是512KB/s&#xff0c;腾讯云10M带宽下载速度是1.25M/秒&#xff0c;腾讯云百科txybk.com来详细说下腾讯云服务器不同公网带宽实际下载速度以及对应的上传速度对照表&…

dig 简明教程

哈喽大家好&#xff0c;我是咸鱼 不知道大家在日常学习或者工作当中用 dig 命令多不多 dig 是 Domain Information Groper 的缩写&#xff0c;对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说&#xff0c;它是一个非常常见且有用的工具。 无论是简单的 DNS 解析查找还…

第三章 数据结构与算法——栈和

栈和队列被称为插入和删除受限制的线性表。 &#x1f341;一、栈的基本概念 &#x1f315;&#xff08;一&#xff09;栈的概念&#xff1a; ①&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈…

四川竹哲电子商务有限公司让抖音带货更轻松

随着电子商务的飞速发展&#xff0c;带货直播成为了新的行业热点。四川竹哲电子商务有限公司&#xff0c;一家在电子商务领域有着深厚实力和丰富经验的企业&#xff0c;正以其独特的视角和策略&#xff0c;引领着抖音带货的发展趋势&#xff0c;让这个新型商业模式更加轻松、高…

C++初阶(三)

文章目录 一、auto关键字(C11)1、auto简介2、auto使用规则1、 auto与指针和引用结合起来使用2、 在同一行定义多个变量 3、auto不能推导的场景1、 auto不能作为函数的参数2、 auto不能直接用来声明数组3、特性总结 二、基于范围的for循环(C11)1、范围for的语法2、 范围for的使用…

基于springboot校园二手书交易管理系统

功能如下图所示 摘要 校园二手书交易管理系统是一款基于Spring Boot框架的应用程序&#xff0c;旨在便捷管理大学校园内的二手书籍交易。该系统致力于为学生和教职工提供一个高效、便捷的平台&#xff0c;以便买卖二手书籍&#xff0c;从而减轻经济压力&#xff0c;减少资源浪费…

Linux高性能服务器编程 学习笔记 第十七章 系统监测工具

tcpdump是一款经典的抓包工具&#xff0c;即使今天我们已经有了像Wireshark这样更易于使用和掌握的抓包工具&#xff0c;tcpdump仍是网络程序员的必备利器。 tcpdump提供了一些选项用以过滤数据包或定制输出格式&#xff0c;常见的选项如下&#xff1a; 1.-n&#xff1a;使用I…

ROS 示例

参考链接1 话题中的Publisher与Subscriber 例1&#xff1a; 发送和接收 hello, world 1、创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace创建完成后&#xff0c;可以在工作空间的根目录下使用catkin_make命令编译整个工作空间&#xff1…

nfs+rpcbind实现服务器之间的文件共享

NFS简介 NFS服务及Network File System&#xff0c;用于在网络上共享存储&#xff0c;分为2,3,4三个版本&#xff0c;最新为4.1版本。NFS基于RPC协议&#xff0c;RPC为Remote Procedure Call的简写。 应用场景&#xff1a;用于A,B,C三台机器上需要保证被访问到的文件是一样…

用Bing绘制「V我50」漫画;GPT-5业内交流笔记;LLM大佬的跳槽建议;Stable Diffusion生态全盘点第一课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 美国升级AI芯片出口禁令&#xff0c;13家中国GPU企业被列入实体清单 nytimes.com/2023/10/05/technology/chip-makers-china-lobbying…

QT自定义空间之软键盘

QT自定义空间之软键盘 1.功能列表2.效果2.1 中文键盘&汉字输入2.2 英文输入法2.3 数字键盘2.4 数据键盘效果 3.部分代码3.1 汉字输入3.2 切换数字键盘3.3 键盘显示&隐藏3.4 控件提升3.5样式设置3.6 使用QLineEditAllKeyBoard 控件 1.功能列表 支持中文输入法支持引文输…

jdk7新增时间类Date,SimpleDateFormat,Calendar

Date //需求1 打印时间远点开始一年后的时间extracted();//需求2 定义任意两个date对象 比较那个时间在前 哪个在后Random rnew Random();Date date1new Date(Math.abs(r.nextInt()));Date date2new Date(Math.abs(r.nextInt()));System.out.println(date1);System.out.printl…