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

题目链接

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 71 2 3 41 2 34 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.mzph.cn/news/111114.shtml

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

相关文章

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

一张图理解MITRE ATTCK框架

看到一张好图&#xff0c;能对MITRE ATT&CK框架做很好的概述&#xff1a; 可以与笔者之前写过的MITRE文章&#xff08;https://blog.csdn.net/ybdesire/category_12472912.html&#xff09;一起阅读&#xff0c;就能更好的理解MITRE。 参考&#xff1a; 吴沛颖.网络威胁情…

【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. RNN与梯度裁剪 2. LSTM模型 3. 训练函数 a. train_epoch b. train 4. 文本预测 5. GPU判断函数 6. 训练与测试 7. 代码整合 经验是智慧之父&#xff0c;记忆…

pdf转二维码怎么做?pdf二维码制作简单技巧

pdf是一种很常见的文件储存格式&#xff0c;一般通知、发票、简历都会保存为这种格式来使用&#xff0c;那么需要将pdf格式文件做成二维码&#xff0c;该用什么方式来制作呢&#xff1f;下面给大家分享一个pdf转二维码的在线工具&#xff0c;可以通过上传文件一键生成二维码&am…

pytorch 入门(二)

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】教案二&#x1f356; 原作者&#xff1a;K同学啊 目录 一、神经网络的组成部分1. 神经元2. 神经网络…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长&#xff0c;人们对高品质食品的需求也越来越大&#xff0c;如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来&#xff0c;宏工科技专注物料处理自动化领域&#xff0c;提供食品物料处理一站式解决方案以提高生…

智能水印相机微信小程序源码

相信大家日常在生活中或者工作中都有使用过水印相机来拍照记录吧&#xff0c;但是又要在手机上面多下载一个APP。 那么小编今天给大家带来一款智能水印相机&#xff0c;拍照自动添加时间、地点、经纬度等水印文字&#xff0c;可用于工作考勤、学习打卡、工作取证等&#xff0c…

Spring5学习笔记之整合MyBatis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

[资源推荐] 飞书画板模板

今天做PPT&#xff0c;尝试了一些AI工具之后&#xff0c;感觉反而降低了做PPT的效率&#xff0c;因为和想实现的效果还是差很多…然后我本人不到万不得已不做PPT&#xff0c;都是用notion这类在线文档来作展示&#xff0c;今天必须得做ppt&#xff0c;但是不想在ppt里面画图&am…

行列转换:MySQL中的数据变形魔法

行转列 使用CASE函数聚合函数 SELECTMAX(CASE WHEN salesperson John THEN sales_amount END) AS John_Sales,MAX(CASE WHEN salesperson Alice THEN sales_amount END) AS Alice_Sales FROM sales_data;列转行 使用UNIO连接每列数据 SELECT product_id,store1 store,sto…

macOS Sonoma 14.1RC(23B73)发布

黑果魏叔10 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.1 RC更新&#xff08;内部版本号&#xff1a;23B73&#xff09;&#xff0c;本次更新距离上次发布隔了 7 天。 macOS Sonoma 14.1RC&#xff08;23B73&#xff09;的更新内容主要包括以下方面&…

办鹿uniapp小程序(一)

一、项目初始化 1. appid 》 公司给你 wxc82730a0fc15e28a 2. 开发者身份 》 公司给你添加 小程序官网&#xff1a;小程序 管理》成员管理》项目成员 1、 uniapp ui组件 &#xff08;uView&#xff09; 如果采用npm安装方式在 小程序端不生效 1.1 采用插件的形式安装&#xf…

【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件

概述 QListWidget类提供了基于项目的列表小部件。 QListWidget是一个方便的类&#xff0c;类似于QListView提供的列表视图&#xff0c;但使用经典的基于项目的接口来添加和删除项目。QListWidget使用内部模型来管理列表中的每个QListWidgetItem。 对于更灵活的列表视图小部件…

Unity游戏开发中ngui和ugui区别与优缺点详解

Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;…

【01】LVGL-CodeBlock模拟器安装 | LVGL工程下载 | PC端模拟LVGL步骤

LVGL模拟器 1.LVGL模拟器介绍2.Windows环境搭建CodeBlock及获取LVGL工程3.PC端模拟LVGL4.总结 1.LVGL模拟器介绍 LVGL模拟器&#xff1a;使用PC端软件模拟LVGL运行&#xff0c;而不需要任何嵌入式硬件。优点&#xff1a;便于学习、跨平台协同开发 2.Windows环境搭建CodeBlock及…

C# Onnx Yolov8 Detect 戴口罩检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

数据库索引种类

文章目录 索引的优缺点优点缺点 聚簇索引特点优点缺点 非聚簇索引特点优点缺点使用场景&#xff1a; 在MyISAM与InnoDB中的使用 索引的优缺点 索引概述 MySQL官方将索引定义为帮助MySQL高效获取数据的数据结构。索引的本质是一种排好序的快速查找数据结构&#xff0c;用于满足…

Redis AOF持久化和ReWrite

前言 Redis 的 RDB 持久化机制简单直接&#xff0c;把某一时刻的所有键值对以二进制的方式写入到磁盘&#xff0c;特点是恢复速度快&#xff0c;尤其适合数据备份、主从复制场景。但如果你的目的是要保证数据可靠性&#xff0c;RDB 就不太适合了&#xff0c;因为 RDB 持久化不…

关闭mysql,关闭redis服务

1. 关闭redis服务&#xff1a; 查询redis安装目录&#xff1a; whereis redis which redis find / -name redis 关闭redis服务&#xff1a; redis-cli -h 127.0.0.1 -p 6379 auth 输入密码 shutdown 关闭redis服务 2. 关闭mysql服务&#xff1a; 查询mysql安装目录&…

Typora 导出PDF 报错 failed to export as pdf. undefined 解决方案

情况 我想把一个很大的markdown 导出为 248页的pdf 然后就报错 failed to export as pdf. undefined 原因 &#xff1a; 个人感觉应该是图片太大了 格式问题之类导致的 解决 文件 -> 偏好设置 - > 导出 -> pdf -> 自定义 -> 把大小全部改为24mm (虽然图中是32 …