[python 刷题] 4 Median of Two Sorted Arrays

[python 刷题] 4 Median of Two Sorted Arrays

题目:

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

The overall run time complexity should be O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n)).

这道题给了两个排序好的数组,然后求有序数组的中位数

这题还是比较难的,我个人觉得直接跳到最优解理解起来会有点吃力,所以就循序从简到繁开始理解起来

暴力解 ( m + n ) l o g ( m + n ) (m + n) log(m + n) (m+n)log(m+n)

在不考虑时间复杂度为 O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n)) 的情况下,这道题最简单的解法就是合并两个数组,进行排序,找出中位数。即当数组长度为奇数时 a r r [ n / / 2 ] arr[n // 2] arr[n//2],当数组长度为偶数时 ( a r r [ ( n − 1 ) / / 2 ] + a r r [ n / / 2 ] ) / 2 (arr[(n - 1) // 2] + arr[n // 2]) / 2 (arr[(n1)//2]+arr[n//2])/2,其中 n n n 为数组的长度。

这样的解法时间复杂度为 ( m + n ) l o g ( m + n ) (m + n) log(m + n) (m+n)log(m+n),并不能算是一个非常有效的算法

优化 ( m + n ) (m + n) (m+n)

但是已知两个数组都是有序数组,要找的又是中位数,那就可以换个思路去解决这个问题,中位数既然是数组最中间的数字,那也就意味着中位数能够将排序的数组分成 l l l r r r,其中

  • 在有序数组长度和为偶数时, l e n ( l ) = l e n ( r ) len(l) = len(r) len(l)=len(r)
  • 在有序数组长度和为奇数时, l e n ( l ) = l e n ( r ) − 1 len(l) = len(r) - 1 len(l)=len(r)1

而同样也可以生成两个指针 p t r 1 ptr1 ptr1 p t r 2 ptr2 ptr2 指向 m m m n n n,使得 p t r 1 + p t r 2 = l e n ( l ) ptr1 + ptr2 = len(l) ptr1+ptr2=len(l),这样就能通过 m[ptr1]n[ptr2] 获得中位数

图解一下就是,每次做遍历的时候判断一下当前 ptr 上所对比的两个数字:

在这里插入图片描述

A < B A<B A<B 时,将 A A A 所对标的指针指向下一个数字 C C C

在这里插入图片描述

接着对比 B B B C C C,一直抵达中位数时种植循环。代码如下:

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:n, m = len(nums1), len(nums2)i, j = 0, 0m1, m2 = 0, 0for count in range(0, (n + m) // 2 + 1):m2 = m1# both array has lengthif i < n and j < m:if nums1[i] > nums2[j]:m1 = nums2[j]j += 1else:m1 = nums1[i]i += 1elif i < n:m1 = nums1[i]i += 1else:m1 = nums2[j]j += 1return m1 if (n + m) % 2 else (m1 + m2) / 2

这样优化下来的时间复杂度为 O ( m + n ) O(m+n) O(m+n),空间复杂度为 O ( 1 ) O(1) O(1),并且这个解法是能过的,不过我不确定在服务器忙的时候会不会 timeout

优化 l o g ( m + n ) log(m + n) log(m+n)

上面的解法是从下标为 0 开始进入循环的,但是反过来从 l e n ( a r r ) − 1 len(arr) - 1 len(arr)1 做循环也可以,现在就有了几个先决条件:

  • l = 0
  • r = len(arr) - 1
  • 中位数 (mid)

再加上题目中 O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n)) 的提示,接下来就开始捋 binary search 的解法

即同样采用 优化 ( m + n ) (m + n) (m+n) 的解法,不过这里对比一个数字一个数字的对比,这里直接选取较短数组的中位数开始对比,只要额外满足 m a x ( l a , l b ) ≤ m i n ( r a , r b ) max(l_a, l_b) \le min(r_a, r_b) max(la,lb)min(ra,rb) 这一条件,就能够保证已经找到对应的中位数,如:

在这里插入图片描述

这个时候判断 m 1 m1 m1 m 2 m2 m2 的大小,就可以对整个数组进行对半切割,进行下一步查找,从而达成 l o g ( m i n ( m , n ) ) log(min(m, n)) log(min(m,n)) 的时间复杂度

另外这里其实需要用 4 个指针进行交错对比:

在这里插入图片描述

才能更好判断从哪里开始切割

另外,针对可能存在较短数组只存在于一边的 cluster,如 A=[8], B=[1,1,2,2,3,3,4,5] 这种情况,需要进行一个下标的判断,同时辅以默认值

代码如下:

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:a, b = nums1, nums2total = len(nums1) + len(nums2)half = total // 2if len(b) < len(a):a, b = a, bl, r = 0, len(a) - 1while True:i = (l + r) // 2  # aj = half - i - 2  # ba_left = a[i] if i >= 0 else float("-infinity")a_right = a[i + 1] if (i + 1) < len(a) else float("infinity")b_left = b[j] if j >= 0 else float("-infinity")b_right = b[j + 1] if (j + 1) < len(b) else float("infinity")# partition is correctif max(a_left, b_left) <= min(a_right, b_right):# oddif total % 2:return min(a_right, b_right)# evenreturn (max(a_left, b_left) + min(a_right, b_right)) / 2elif a_left > b_right:r = i - 1else:l = i + 1

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

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

相关文章

设计模式探索:从理论到实践的编码示例 (软件设计师笔记)

&#x1f600;前言 设计模式&#xff0c;作为软件工程领域的核心概念之一&#xff0c;向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码&#xff0c;而且也促进了代码的复用性。通过这篇文章&#xff0c;我们…

Springboot+vue的开放性实验室管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的开放性实验室管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的开放性实验室管理系统&#xff0c;采用M&#xff08…

最新AI智能创作系统源码SparkAi系统V2.6.3/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;已支持OpenAIGPT全模型国内AI全模型&#xff0c;已支持国内AI模型 百度文心一言、微软Azure、阿里云通义千问模型、清华智谱AIChatGLM、科大讯飞星火大模型等。本期针对源码…

【立体视觉(五)】之立体匹配与SGM算法

【立体视觉&#xff08;五&#xff09;】之立体匹配与SGM算法 一、立体匹配一&#xff09;基本步骤二&#xff09;局部立体匹配三&#xff09;全局立体匹配四&#xff09;评价标准1. 均方误差(RMS)2. 错误匹配率百分比(PBM) 二、半全局(SGM)立体匹配一&#xff09;代价计算二&a…

各平台更新根证书

windows7 windows7根证书更新 https://support.microsoft.com/en-us/topic/support-for-urgent-trusted-root-updates-for-windows-root-certificate-program-in-windows-a4ac4d6c-7c62-3b6e-dfd2-377982bf3ea5 Linux 查看证书 ls -l /etc/ssl/certs/更新根证书 update-ca…

项目规划得心应手:Plane 助你打造高效能团队 | 开源日报 No.48

streamlit/streamlit Stars: 27.5k License: Apache-2.0 Streamlit 是一个快速构建和共享数据应用程序的方法。它可以将数据脚本转换为可分享的 Web 应用&#xff0c;只需几分钟即可完成。该项目完全由 Python 编写&#xff0c;开源且免费&#xff01;一旦创建了一个应用程序&…

Ubuntu 2204 搭建 nextcloud 个人网盘

Nextcloud是一套用于创建网络硬盘/云盘以存放文件的客户端-服务器软件&#xff0c;Nextcloud 完全开源并且免费。 一、搭建 ubuntu apache2 mysql php &#xff08;lamp&#xff09;环境 因为 nextcloud 服务是使用 php 语言和 mysql 数据库的web服务&#xff0c;因此需要…

FFmpeg 基础模块:容器相关的 API 操作

目录 AVFormat 模块 AVFormat 前处理部分 AVFormat 读写处理部分 小结 思考 FFmpeg 目录中包含了 FFmpeg 库代码目录、构建工程目录、自测子系统目录等&#xff0c;具体内容如下&#xff1a; 现在你知道 FFmpeg 的源代码目录中都包含了哪些内容&#xff0c;在之后使用 FFm…

kafka初体验基础认知部署

kafka 基础介绍 Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理高吞吐量的数据流&#xff0c;并将数据实时地分…

modelize.ai - 小记

文章目录 关于 关于 官网&#xff1a;https://www.beta.modelize.ai Modelize.ai是一个AI agents和teams的创作平台&#xff0c;通过结合多元的agents以及工作流的衔接&#xff0c;让AI agents之间高效协同&#xff0c;达到一键式完成复杂工作的效果。 公司的愿景是让AI打工人…

「专题速递」RTC云网端联合优化、弱网对抗策略、QUIC协议的能力和实践

随着互联网日益增长的加速需求、复杂的网络环境和多样化的视频业务&#xff0c;音视频技术领域的专家们正在不断探索如何实现准确和极低延迟的网络传输能力。他们在应用层流控、传输层协议设计以及跨层优化等方面积极努力&#xff0c;以改善用户的网络体验。 在当今数字化时代&…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具&#xff0c;适合需要频繁切换系统设置和启动应用程序的用户使用。通过它&#xff0c;用户可以更方便地完成日常操作&#xff0c;提高工作效率。 快速访问工具&#xff1a;One Switch提供了一个便捷的菜单栏图标&#xff0c;…

Android:实现手机前后摄像头预览同开

效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLES&#xff1a;GLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解&#xff0c;而前后双摄实现原理其实也并不复杂&#xff0c;粗糙点说就是把单摄像头预览流程写两…

计算机网络(第8版)-第4章 网络层

4.1 网络层的几个重要概念 4.1.1 网络层提供的两种服务 如果主机&#xff08;即端系统&#xff09;进程之间需要进行可靠的通信&#xff0c;那么就由主机中的运输层负责&#xff08;包括差错处理、流量控制等&#xff09;。 4.1.2 网络层的两个层面 4.2 网际协议 IP 图4-4 网…

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类&#xff0c;但是发现怎么也引入不进来 A项目打包之后&#xff0c;想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF&#xff0c; 然后去A项目中查找&#xff…

黑马点评-02使用Redis代替session,Redis + token机制实现

Redis代替session session共享问题 每个Tomcat中都有一份属于自己的session,所以多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时可能会导致数据丢失 用户第一次访问1号tomcat并把自己的信息存放session域中, 如果第二次访问到了2号tomcat就无法获取到在1号…

CSS小计

1&#xff1a;设置图片随窗缩放 使用百分比 width: 100%;height: 100%; 使用vmin: 将可视区域分为100vmin width: 100vmin;height: 100vmin; 2:设置字体颜色与背景色融合 mix-blend-mode: difference 3: 设置宽度自适应 width:fit-content 4:外边距合并 当两个相领的两个容…

Prompt-Tuning(一)

一、预训练语言模型的发展过程 第一阶段的模型主要是基于自监督学习的训练目标&#xff0c;其中常见的目标包括掩码语言模型&#xff08;MLM&#xff09;和下一句预测&#xff08;NSP&#xff09;。这些模型采用了Transformer架构&#xff0c;并遵循了Pre-training和Fine-tuni…

【MySql】4- 实践篇(二)

文章目录 1. SQL 语句为什么变“慢”了1.1 什么情况会引发数据库的 flush 过程呢&#xff1f;1.2 四种情况性能分析1.3 InnoDB 刷脏页的控制策略 2. 数据库表的空间回收2.1 innodb_file_per_table参数2.2 数据删除流程2.3 重建表2.4 Online 和 inplace 3. count(*) 语句怎样实现…

Uniapp 婚庆服务全套模板前端

包含 首页、社区、关于、我的、预约、订购、选购、话题、主题、收货地址、购物车、系统通知、会员卡、优惠券、积分、储值金、订单信息、积分、充值、礼品、首饰等 请观看 图片参观 开源&#xff0c;下载即可 链接&#xff1a;婚庆服务全套模板前端 - DCloud 插件市场 问题反…