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

【Python 千题 —— 算法篇】寻找两个正序数组的中位数

请添加图片描述

Python 千题持续更新中 ……
脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐

字符串处理

题目背景

在处理大规模数据时,我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。该问题不仅是算法面试中的经典题目之一,还在数据分析、统计学等多个领域有实际应用。

求解两个正序数组的中位数是一种复杂的计算,因为它要求我们在保证时间复杂度足够低的情况下,不破坏正序数组的性质。理解和解决这个问题,可以大幅提升我们在算法设计与优化上的能力。

题目描述

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出这两个正序数组的中位数,要求算法的时间复杂度为 O(log(m+n))。

你需要实现一个函数 findMedianSortedArrays(),该函数接收两个正序数组 nums1nums2 作为输入,并返回它们的中位数。

输入描述

  • 两个正序数组 nums1nums2,每个数组的长度在 [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))),效率非常高。
  • 只需在较短的数组上进行二分查找,避免了不必要的计算。

缺点:

  • 实现起来稍微复杂一些,需要对二分查找和数组的划分有深入理解。

总结与思考

在处理寻找两个正序数组中位数的问题时,使用不同的方法可以得到不同的效率:

  1. 合并排序法:易于理解,但时间复杂度较高,适合小规模数据。
  2. 双指针法:通过双指针合并数组,时间复杂度 O(m + n),适合中等规模数据。
  3. 二分查找法:通过二分查找,在较短数组上进行划分,时间复杂度为 O(log(min(m, n))),是处理大规模数据的最佳选择。

对于这种涉及高效搜索和排序的题目,掌握二分查找的应用至关重要。通过本题目,我们不仅能够提升对数组和中位数的理解,还能够学到如何优化时间复杂度,使算法在处理大规模数据时更加高效。


扩展思考

  1. 统计学应用:中位数在统计分析中起着重要作用,掌握高效的中位数计算方法可以帮助我们在大数据处理中更快得出结论。
  2. 二分查找应用:本题目中的二分查找方法,不仅适用于数组合并中位数问题,还可以拓展到其他查找问题中,比如查找区间、寻找特定元素等。
  3. 复杂数据结构的处理:在实际应用中,数据可能并非简单的正序数组,而是树、图等复杂数据结构,学会如何在这些结构中寻找中位数同样是算法设计的重要内容。

希望通过本文的讲解,你能够深入理解寻找两个正序数组中位数的各种方法,并掌握高效的算法技巧。

持续关注博客,获取更多编程练习与技巧!
作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Python 千题 —— 算法篇】寻找两个正序数组的中位数

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

Autoware 定位之初始姿态输入(九)

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

C# 自定义传值窗体-适合多参数传值

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

Ubuntu20.04+ros-noetic配置Cartographer

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

Visual Studio 2022 下载和安装

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

在 Windows 环境下实现免密登录 Linux 服务器

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

Computer Exercise

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

利用Stable Diffusion AI图像模型评估智能车模型算法表现(下篇)

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

音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现

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

springboot中的请求过滤filter与拦截interceptor分析

首先我们要定义一个类&#xff0c;实现标准的过滤器 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入门与生态全解析&#xff1a;包管理与构建工具详解 目录 &#x1f3af; 包管理 使用 npm 和 yarn&#xff1a;项目依赖管理的利器创建和发布 npm 包&#xff1a;实现模块化与共享 ⚙️ 构建工具 使用 Webpack 和 Babel&#xff1a;高效打包与代码转换配置构建流程&am…...

828华为云征文|华为云Flexus X实例docker部署harbor镜像仓库

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

fedora siliverblue adb

开始 1、找到手机 usb 的 idV&#xff1a; $ lsusb ... Bus 001 Device 012: ID 22d9:2766 OPPO Electronics Corp. PECM30是 22d9 2、在 toolbox 外面添加 udev&#xff1a; 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 代理地址繁多之因

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

MyBatis常见面试题

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

Swift 运算符

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

PDF转PPT神器揭秘!3步操作,轻松打造2024年会议爆款PPT

现在是数字化的时代&#xff0c;PDF 和 PPT 对职场的人来说可重要了。PDF 文件格式稳&#xff0c;也好分享&#xff0c;所以大家都爱用。PPT 演示起来很厉害&#xff0c;在开会、讲座的时候特别管用。不过呢&#xff0c;要是有好多 PDF 文件&#xff0c;咋能快点把它们变成好看…...

✨机器学习笔记(一)—— 监督学习和无监督学习

1️⃣ 监督学习&#xff08;supervised learning&#xff09; ✨ 两种主要类型的监督学习问题&#xff1a; 回归&#xff08;regression&#xff09;&#xff1a;predict a number in infinitely many possible outputs. 分类&#xff08;classification&#xff09;&#xff1…...

【Netty】实战:基于Http的Web服务器

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

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...