【Python 千题 —— 算法篇】寻找两个正序数组的中位数
Python 千题持续更新中 …… |
脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ |
题目背景
在处理大规模数据时,我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。该问题不仅是算法面试中的经典题目之一,还在数据分析、统计学等多个领域有实际应用。
求解两个正序数组的中位数是一种复杂的计算,因为它要求我们在保证时间复杂度足够低的情况下,不破坏正序数组的性质。理解和解决这个问题,可以大幅提升我们在算法设计与优化上的能力。
题目描述
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出这两个正序数组的中位数,要求算法的时间复杂度为 O(log(m+n))。
你需要实现一个函数 findMedianSortedArrays()
,该函数接收两个正序数组 nums1
和 nums2
作为输入,并返回它们的中位数。
输入描述
- 两个正序数组
nums1
和nums2
,每个数组的长度在[0, 1000]
之间,且元素是有序的整数。
输出描述
- 一个浮点数,表示两个数组合并后的中位数,结果需要保留到小数点后 1 位。
示例
示例 ①
输入:
# 调用 findMedianSortedArrays() 函数
print(findMedianSortedArrays([1, 3], [2]))
输出:
2.0
解释:合并数组 [1, 2, 3],中位数是 2。
示例 ②
输入:
print(findMedianSortedArrays([1, 2], [3, 4]))
输出:
2.5
解释:合并数组 [1, 2, 3, 4],中位数是 (2 + 3) / 2 = 2.5。
代码讲解与多种解法
解法一:合并排序法
一种直观的解法是将两个数组合并为一个,然后对合并后的数组进行排序。排序后,根据数组长度的奇偶性判断并找到中位数。这种方法虽然易于理解,但时间复杂度为 O((m + n)log(m + n)),在效率上不够理想。
def findMedianSortedArrays(nums1, nums2):merged = sorted(nums1 + nums2)n = len(merged)if n % 2 == 1:return merged[n // 2]else:return (merged[n // 2 - 1] + merged[n // 2]) / 2
优点:
- 思路清晰,容易实现。
缺点:
- 时间复杂度较高 O((m + n)log(m + n)),尤其在数据规模较大的情况下效率较低。
解法二:双指针法
双指针法通过利用两个数组已经排序的特点,不需要完整合并数组,而是使用双指针遍历两个数组,逐步找到中位数位置。这种方法的时间复杂度为 O(m + n),比合并排序法有所改进,但不符合 O(log(m + n)) 的要求。
def findMedianSortedArrays(nums1, nums2):m, n = len(nums1), len(nums2)merged = []i, j = 0, 0while i < m and j < n:if nums1[i] < nums2[j]:merged.append(nums1[i])i += 1else:merged.append(nums2[j])j += 1merged += nums1[i:] + nums2[j:]total_len = m + nif total_len % 2 == 1:return merged[total_len // 2]else:return (merged[total_len // 2 - 1] + merged[total_len // 2]) / 2
优点:
- 时间复杂度降为 O(m + n),相较于合并排序法更加高效。
缺点:
- 时间复杂度仍然不满足 O(log(m + n)) 的要求。
解法三:二分查找法
为了满足时间复杂度 O(log(m + n)) 的要求,我们可以采用二分查找的方法。在两个数组中使用二分查找法寻找中位数,核心思想是通过划分两个数组,使得左半部分的所有元素都小于右半部分的所有元素。
我们可以通过在较短的数组中使用二分查找,不断调整两个数组的划分位置,直到找到合适的中位数。
def findMedianSortedArrays(nums1, nums2):if len(nums1) > len(nums2):nums1, nums2 = nums2, nums1m, n = len(nums1), len(nums2)imin, imax, half_len = 0, m, (m + n + 1) // 2while imin <= imax:i = (imin + imax) // 2j = half_len - iif i < m and nums1[i] < nums2[j - 1]:imin = i + 1elif i > 0 and nums1[i - 1] > nums2[j]:imax = i - 1else:if i == 0: max_of_left = nums2[j - 1]elif j == 0: max_of_left = nums1[i - 1]else: max_of_left = max(nums1[i - 1], nums2[j - 1])if (m + n) % 2 == 1:return max_of_leftif i == m: min_of_right = nums2[j]elif j == n: min_of_right = nums1[i]else: min_of_right = min(nums1[i], nums2[j])return (max_of_left + min_of_right) / 2
优点:
- 时间复杂度为 O(log(min(m, n))),效率非常高。
- 只需在较短的数组上进行二分查找,避免了不必要的计算。
缺点:
- 实现起来稍微复杂一些,需要对二分查找和数组的划分有深入理解。
总结与思考
在处理寻找两个正序数组中位数的问题时,使用不同的方法可以得到不同的效率:
- 合并排序法:易于理解,但时间复杂度较高,适合小规模数据。
- 双指针法:通过双指针合并数组,时间复杂度 O(m + n),适合中等规模数据。
- 二分查找法:通过二分查找,在较短数组上进行划分,时间复杂度为 O(log(min(m, n))),是处理大规模数据的最佳选择。
对于这种涉及高效搜索和排序的题目,掌握二分查找的应用至关重要。通过本题目,我们不仅能够提升对数组和中位数的理解,还能够学到如何优化时间复杂度,使算法在处理大规模数据时更加高效。
扩展思考
- 统计学应用:中位数在统计分析中起着重要作用,掌握高效的中位数计算方法可以帮助我们在大数据处理中更快得出结论。
- 二分查找应用:本题目中的二分查找方法,不仅适用于数组合并中位数问题,还可以拓展到其他查找问题中,比如查找区间、寻找特定元素等。
- 复杂数据结构的处理:在实际应用中,数据可能并非简单的正序数组,而是树、图等复杂数据结构,学会如何在这些结构中寻找中位数同样是算法设计的重要内容。
希望通过本文的讲解,你能够深入理解寻找两个正序数组中位数的各种方法,并掌握高效的算法技巧。
持续关注博客,获取更多编程练习与技巧! |
作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:

【Python 千题 —— 算法篇】寻找两个正序数组的中位数
Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在处理大规模数据时,我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。…...

Autoware 定位之初始姿态输入(九)
0. 简介 这一讲按照《Autoware 技术代码解读(三)》梳理的顺序,我们来说一说Autoware中的初始化操作,这个软件包当中完成了ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_match…...

C# 自定义传值窗体-适合多参数传值
将子窗体的值回传到父窗体中,或者最简单的需要一个设置参数的对话框,其作用也就是得到其中的参数。下面我们详细介绍实现的过程。 文章目录 一、定义一个事件类二、在参数窗体中定义事件三、订阅事件消息 一、定义一个事件类 首先,我们必须…...

Ubuntu20.04+ros-noetic配置Cartographer
一、概述 因为要配置激光SLAM,Cartographer属于激光雷达SLAM 中比较经典的一款,在学习之前先将其在Ubuntu20.04首先配置出来并成功运行demo。 二、具体操作 (一)概述 使用平台是Windows的wsl2上的Ubuntu20.04子系统,…...

Visual Studio 2022 下载和安装
文章目录 概述一,下载步骤二,安装过程 概述 Visual Studio 提供 AI 增强功能,例如用于上下文感知代码补全的 IntelliSense 和可利用开源代码中的 AI 模式的 IntelliCode。 集成的 GitHub Copilot 提供 AI 支持的代码补全、聊天辅助、调试建议…...

在 Windows 环境下实现免密登录 Linux 服务器
在 Windows 环境下实现免密登录 Linux 服务器 1. 生成 SSH 密钥对2. 手动将公钥上传到服务器方法 1:使用 scp 传输公钥文件方法 2:使用 Windows 内置工具或编辑器手动复制 3. 测试免密登录4. 可能需要的工具 以下是在 Windows 中实现免密登录的步骤&…...

Computer Exercise
每日一练 单选题 在计算机机箱前面板接口插针上( C )表示复位开关。 A.SPK B.PWRLED C.RESET D.HDDLED每台PC机最多可接( B )块IDE硬盘。 A.2 B.4 C.6 D.8( …...

利用Stable Diffusion AI图像模型评估智能车模型算法表现(下篇)
今天小李哥将介绍亚马逊云科技的Jupyter Notebook机器学习托管服务Amazon SageMaker上,通过AI图像生成模型Stable Diffusion Upscale和Depth、向量知识库和LangChain Agent,生成用于AI 智能车模型训练的图像数据集并评估模型表现。 本系列共分为上下两篇…...

音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现
一、引言 本文讲解FFmpeg源码对WAV音频文件进行解复用(解封装)时,其AVStream的time_base是怎样被计算出来的。 二、FFmpeg源码中计算WAV音频文件AVStream的time_base的实现 从《音视频入门基础:WAV专题(5)…...

springboot中的请求过滤filter与拦截interceptor分析
首先我们要定义一个类,实现标准的过滤器 import lombok.extern.slf4j.Slf4j;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter("/*") Slf4j public class AuthFilter implements Filter {Overr…...

Node.js入门与生态全解析:包管理与构建工具详解
Node.js入门与生态全解析:包管理与构建工具详解 目录 🎯 包管理 使用 npm 和 yarn:项目依赖管理的利器创建和发布 npm 包:实现模块化与共享 ⚙️ 构建工具 使用 Webpack 和 Babel:高效打包与代码转换配置构建流程&am…...

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库
828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错…...

fedora siliverblue adb
开始 1、找到手机 usb 的 idV: $ lsusb ... Bus 001 Device 012: ID 22d9:2766 OPPO Electronics Corp. PECM30是 22d9 2、在 toolbox 外面添加 udev: sudo nano /etc/udev/rules.d/51-android.rulesSUBSYSTEM"usb", ATTR{idVendor}"…...

mybatisplus查询指定字段
使用mybatisplus查询指定字段 实体类 package com.test.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annota…...

探寻 IP 代理地址繁多之因
在当今的网络天地里,IP 代理服务随处可见,且令人称奇的是,它们常常手握海量的 IP 地址可供挑选。那么,究竟是什么原因使得 IP 代理拥有如此众多的地址呢?现在,就让我们一同深入探究这个神秘现象背后的缘由。…...

MyBatis常见面试题
文章目录 说说 MyBatis 执行流程?1. 加载配置文件和映射文件2. 构建 SqlSessionFactory3. 创建 SqlSession4. 调用 Mapper 方法5. 处理参数和结果映射6. 事务管理7. 释放资源简化流程图: MyBatis 和 Hibernate 有什么不同?1. **对象关系映射层…...

Swift 运算符
Swift 运算符 Swift 是一种强类型编程语言,由苹果公司开发,用于iOS、macOS、watchOS和tvOS应用程序的开发。Swift 运算符是其核心特性之一,它允许开发者执行各种数学和逻辑操作。本文将详细介绍 Swift 中的运算符,包括它们的功能、用法和类型。 Swift 运算符概述 Swift …...

PDF转PPT神器揭秘!3步操作,轻松打造2024年会议爆款PPT
现在是数字化的时代,PDF 和 PPT 对职场的人来说可重要了。PDF 文件格式稳,也好分享,所以大家都爱用。PPT 演示起来很厉害,在开会、讲座的时候特别管用。不过呢,要是有好多 PDF 文件,咋能快点把它们变成好看…...

✨机器学习笔记(一)—— 监督学习和无监督学习
1️⃣ 监督学习(supervised learning) ✨ 两种主要类型的监督学习问题: 回归(regression):predict a number in infinitely many possible outputs. 分类(classification)࿱…...

【Netty】实战:基于Http的Web服务器
目录 一、实现ChannelHandler 二、实现ChannelInitializer 三、实现服务器启动程序 四、测试 本文来实现一个简单的Web服务器,当用户在浏览器访问Web服务器时,可以返回响应的内容给用户。很简单,就三步。 一、实现ChannelHandler pack…...

4K4D: Real-Time 4D View Synthesis at 4K Resolution 学习笔记
本文是学习4K4D的笔记记录 Project Page:https://zju3dv.github.io/4k4d/ 文章目录 1 Pipeline1.1 特征向量的计算1.2 几何建模1.3 外观建模⭐1) 球谐函数SH模型2) 图像融合技术 1.4 可微分深度剥离渲染 2 Train(loss)…...

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享
期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信…...

【C++】关于类的public、protected 、private
public、protected、private是访问控制修饰符,决定了类成员的可访问性,特性如下: public: 可以被类内部和类外部直接访问 可以被派生类访问 protected: 可以被类内部访问 可以被派生类访问 不能被类的外部直接访问 p…...

使用 POST 方法与 JSON 格式进行 HTTP 请求的最佳实践
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...

学习笔记--Java基础核心知识
方法重载 请记住下面重载的条件 方法名称必须相同。参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)。方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。重载是发生在编译时的,因为编译器可以根…...

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI
BAPI作为SAP中的重要概念,在SAP系统的开发中几乎是必须的。 本章来学习一下BAPI 的直观印象,以及在ABAP代码中的调用。 目录 1, BAPI概述 1,从画面角度来直观体验一下BAPI 1-1,MM:購買依頼変更BAPI - …...

mysql笔记3(数据库、表和数据的基础操作)
文章目录 一、数据库的基础操作1. 显示所有的仓库(数据库)2. 创建数据库注意(命名规范): 3. 删除数据库4. 查看创建数据库的SQL5. 创建数据库时跟随字符编码6. 修改数据库的字符编码 二、表的基础操作1. 引入表的思维2. 引用数据库3. 查看该数据库下面的表4. 创建表…...

计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】
💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的企业人事管理系…...

科研绘图系列:R语言折线图(linechart plots)
文章目录 介绍加载R包导入数据数据预处理画图组合图形介绍 在R语言中,折线图(Line Plot)是一种常用的数据可视化类型,用于展示数据随时间或有序类别变化的趋势。折线图通过连接数据点来形成一条或多条线,这些线条可以清晰地表示数据的变化方向、速度和模式。 加载R包 k…...

Opencv中的直方图(5)计算EMD距离的函数EMD()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离(Earth Mover’s Distance)和/或两个加权点配…...