[python 刷题] 4 Median of Two Sorted Arrays

news2024/11/19 3:30:59

[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, 0
        m1, m2 = 0, 0

        for count in range(0, (n + m) // 2 + 1):
            m2 = m1
            # both array has length
            if i < n and j < m:
                if nums1[i] > nums2[j]:
                    m1 = nums2[j]
                    j += 1
                else:
                    m1 = nums1[i]
                    i += 1
            elif i < n:
                m1 = nums1[i]
                i += 1
            else:
                m1 = nums2[j]
                j += 1

        return 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, nums2
        total = len(nums1) + len(nums2)
        half = total // 2

        if len(b) < len(a):
            a, b = a, b

        l, r = 0, len(a) - 1
        while True:
            i = (l + r) // 2  # a
            j = half - i - 2  # b

            a_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 correct
            if max(a_left, b_left) <= min(a_right, b_right):
                # odd
                if total % 2:
                    return min(a_right, b_right)
                # even
                return (max(a_left, b_left) + min(a_right, b_right)) / 2
            elif a_left > b_right:
                r = i - 1
            else:
                l = i + 1

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

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

相关文章

lv8 嵌入式开发-网络编程开发 14

目录 1 I/O基本概念 1.1 IO概念 1.2 同步和异步 1.3 阻塞和非阻塞 2 五种I/O模型 2.1 阻塞IO 2.2 非阻塞I/O 2.3 多路复用I/O ​编辑 2.4 信号驱动式I/O ​编辑 2.5 异步I/O模型​编辑 3 五种I/O模型比较 4 练习 1 I/O基本概念 1.1 IO概念 I/O即数据的读取&#x…

功能定义-前方交通穿行提示制动

功能概述 前方交通穿行提示(Front Cross Traffic Alert)&#xff0c;简称FCTA&#xff0c;其功能表现为在车辆低速前进时&#xff0c;实时监测车辆前部横向接近的其他道路使用者&#xff0c;并在可能发生碰撞风险时发出警告信息 前方交通穿行制动(Front Cross Traffic Braking…

算法题:分发饼干

这个题目是贪心算法的基础练习题&#xff0c;解决思路是排序双指针谈心法&#xff0c;先将两个数组分别排序&#xff0c;优先满足最小胃口的孩子。&#xff08;本题完整题目附在了最后面&#xff09; 代码如下&#xff1a; class Solution(object):def findContentChildren(se…

【Unity ShaderGraph】| 快速制作一个实用的 模型溶解效果

前言 【Unity ShaderGraph】| 快速制作一个实用的 模型溶解效果一、效果展示二、简易溶解效果三、进阶溶解效果四、应用实例 前言 本文将使用ShaderGraph制作一个模型溶解的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1…

【Docker内容大集合】Docker从认识到实践再到底层原理大汇总

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

Android SurfaceFlinger导读(04)理解BufferQueue

该系列文章总纲链接&#xff1a;Android GUI系统之SurfaceFlinger 系列文章目录 说明&#xff1a; 关于导读&#xff1a;导读部分主要是方便初学者理解SurfaceFlinger代码中的机制&#xff0c;为后面分析代码打下一个更好的基础&#xff0c;这样就可以把更多的精力放在surfac…

使用opencv及FFmpeg编辑视频

使用opencv及FFmpeg编辑视频 1.融合两个视频2.为视频添加声音2.1 安装ffmpy Python包2.2 下载ffmpeg2.3 代码实现 3.效果参考文献 帮朋友做了一个小作业&#xff0c;具体实现分为几个过程&#xff1a; 将两个mp4格式视频融合到一起为新视频添加声音 1.融合两个视频 其中一个…

AI智能创作系统ChatGPT商业运营源码+AI绘画系统/支持GPT联网提问/支持Midjourney绘画+支持国内AI提问模型+Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持国内AI提问模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f…

VSCode Intellij IDEA CE 数据库连接

VSCode & Intellij IDEA CE 数据库连接 大概记一下现在正在用的几个工具/插件 VSCode VSCode 里面的工具我下载了很多&#xff0c;如果只是链接 MySQL 的话&#xff0c;可能用 Jun Han 这位大佬的 MySQL 就好了&#xff1a; 使用这个插件直接打开 .sql 文件单击运行就能…

VMware16.1.2安装及密钥

文章目录 一、VMware 16 虚拟机下载二、安装步骤三、VMware 各版本注册密钥1 、VMware 16密钥2 、VMware 14密钥3 、VMware 15密钥4 、VMware 17密钥 一、VMware 16 虚拟机下载 VMware 16 下载地址&#xff1a; https://www.vmware.com/cn/products/workstation-pro/workstati…

数据结构与算法设计分析——贪心算法的应用

目录 一、贪心算法的定义二、贪心算法的基本步骤三、贪心算法的性质&#xff08;一&#xff09;最优子结构性质&#xff08;二&#xff09;贪心选择性质 四、贪心算法的应用&#xff08;一&#xff09;哈夫曼树——哈夫曼编码&#xff08;二&#xff09;图的应用——求最小生成…

《Linux 内核设计与实现》13. 虚拟文件系统

通用文件接口 VFS 使得可以直接使用 open()、read()、write() 这样的系统调用而无需考虑具体文件系统和实际物理介质。 好处&#xff1a;新的文件系统和新类型的存储介质需要挂载时&#xff0c;程序无需重写&#xff0c;甚至无需重新编译。 VFS 将各种不同的文件系统抽象后采…

[强网杯 2022]factor有感

可直接私信&#xff0b;Q 3431550587 此题记录主要是他运用了几个新看见的攻击思路和拜读了一篇论文&#xff0c;所以写写。题目源码&#xff1a; #encoding:utf-8 from Crypto.Util.number import * from gmpy2 import * from random import randint from flag import flagd…

云服务仿真:完全模拟 AWS 服务的本地体验 | 开源日报 No.45

localstack/localstack Stars: 48.7k License: NOASSERTION LocalStack 是一个云服务仿真器&#xff0c;可以在您的笔记本电脑或 CI 环境中以单个容器运行。它提供了一个易于使用的测试/模拟框架&#xff0c;用于开发云应用程序。主要功能包括&#xff1a; 在本地机器上完全…

CTF之CTF(夺旗赛)介绍

什么是CTF&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;中文一般译作“夺旗赛”&#xff09;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;用以代替之前黑客们通过互相发起真实攻击进行…

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

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

Javascript - 轮播图

轮播图也称banner图、广告图、焦点图、滑片。是指在一个模块或者窗口,通过鼠标点击或手指滑动后,可以看到多张图片。这些图片统称为轮播图,这个模块叫做轮播模块。可以通过运用 javascript去实现定时自动转换图片。以下通过一个小Demo演示如何运用Javascript实现。 <!DOCTYP…

d3dcompiler_47.dll是什么文件?游戏确实d3dcompiler_47.dll的常用解决方法

d3dcompiler_47.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft DirectX 软件组件的一部分。它主要负责处理 DirectX 中的图形和多媒体内容&#xff0c;以确保游戏和应用程序能够正常运行。d3dcompiler_47.dll 的主要功能是将 DirectX API 转…

基于SpringBoot的在线宠物用品交易网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 商品分类管理 品牌信息管理 商品信息管理 商品信息 我的收藏 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

C++设计模式-组合(Composite)

目录 C设计模式-组合&#xff08;Composite&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-组合&#xff08;Composite&#xff09; 一、意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的…