【力扣算法02】之寻找两个正序数组的中位数 - python

news2024/11/15 14:00:29

文章目录

  • 问题描述
    • 示例 1
    • 示例2
    • 提示
  • 解题思路
  • 代码分析
  • 完整代码
  • 运行效果及示例代码
    • 示例代码1
      • 效果图
    • 示例代码2
      • 效果图
  • 完结

问题描述

在这里插入图片描述

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 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
 

提示

nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

解题思路

在这里插入图片描述

  1. 定义了一个名为Solution的类,它包含了一个名为findMedianSortedArrays的方法,这个方法用于查找两个已排序数组的中位数。
  2. 方法参数包括self(表示方法所属的类实例)、nums1nums2(两个已排序的数组)。
  3. 首先,通过比较两个数组的长度,确保nums1是较短的数组,将较长的数组赋值给nums2,以简化后续操作。
  4. 获取nums1nums2的长度分别赋值给变量mn
  5. 初始化变量leftright,分别表示二分查找的起始左右边界,初始值为0m
  6. 初始化变量median1median2,分别表示中位数的左侧和右侧值,初始值为0
  7. 进入while循环,循环条件为left <= right,即当左边界小于等于右边界时,进行循环。
  8. 在循环中,首先计算出两个数组的当前的分隔点partition1partition2,其中partition1nums1的分隔点,partition2nums2的分隔点。
  9. 根据分隔点,计算出四个值:maxLeft1minRight1maxLeft2minRight2
    • maxLeft1表示nums1左侧最大的值,如果partition1为0,则取float('-inf')表示负无穷大;否则,取nums1[partition1-1]
    • minRight1表示nums1右侧最小的值,如果partition1等于m,则取float('inf')表示正无穷大;否则,取nums1[partition1]
    • maxLeft2表示nums2左侧最大的值,如果partition2为0,则取float('-inf')表示负无穷大;否则,取nums2[partition2-1]
    • minRight2表示nums2右侧最小的值,如果partition2等于n,则取float('inf')表示正无穷大;否则,取nums2[partition2]
  10. 接下来通过比较四个值的大小关系,判断当前的分隔点是否符合中位数的条件:
    • 如果满足条件maxLeft1 <= minRight2maxLeft2 <= minRight1,则说明找到了符合中位数条件的分隔点。
    • 如果(m + n)为偶数,则中位数为(max(maxLeft1, maxLeft2) + min(minRight1, minRight2)) / 2.0
    • 如果(m + n)为奇数,则中位数为max(maxLeft1, maxLeft2)
    • 返回计算得到的中位数。
  11. 如果maxLeft1 > minRight2,说明当前的分隔点在nums1中太靠右,需要将右边界right更新为partition1 - 1
  12. 否则,说明当前的分隔点在nums1中太靠左,需要将左边界left更新为partition1 + 1
  13. 循环结束后,如果没有找到符合条件的分隔点,则抛出ValueError异常,表示输入无效。

代码分析

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1

这部分代码定义了一个名为Solution的类,并在该类中定义了一个名为findMedianSortedArrays的方法。方法接受两个已排序的数组nums1nums2作为输入。如果nums1的长度大于nums2的长度,则交换两个数组,以确保nums1是较短的数组。

        m, n = len(nums1), len(nums2)
        left, right = 0, m
        median1, median2 = 0, 0

这部分代码初始化了一些变量。mn分别表示nums1nums2的长度。leftright分别表示二分查找的起始左右边界,初始值为0mmedian1median2分别表示中位数的左侧和右侧值,初始值为0

        while left <= right:
            partition1 = (left + right) // 2
            partition2 = (m + n + 1) // 2 - partition1
            
            maxLeft1 = float('-inf') if partition1 == 0 else nums1[partition1 - 1]
            minRight1 = float('inf') if partition1 == m else nums1[partition1]
            
            maxLeft2 = float('-inf') if partition2 == 0 else nums2[partition2 - 1]
            minRight2 = float('inf') if partition2 == n else nums2[partition2]

这部分代码进入了一个while循环,该循环用于执行二分查找。循环条件是left <= right,即当左边界小于等于右边界时,进行循环。

在循环中,首先计算出两个数组的当前的分隔点partition1partition2partition1nums1的分隔点,partition2nums2的分隔点。

然后,通过分隔点计算出四个值:maxLeft1minRight1maxLeft2minRight2

  • maxLeft1表示nums1左侧最大的值,如果partition1为0,则取float('-inf')表示负无穷大;否则,取nums1[partition1-1]
  • minRight1表示nums1右侧最小的值,如果partition1等于m,则取float('inf')表示正无穷大;否则,取nums1[partition1]
  • maxLeft2表示nums2左侧最大的值,如果partition2为0,则取float('-inf')表示负无穷大;否则,取nums2[partition2-1]
  • minRight2表示nums2右侧最小的值,如果partition2等于n,则取float('inf')表示正无穷大;否则,取nums2[partition2]
            if maxLeft1 <= minRight2 and maxLeft2 <= minRight1:
                if (m + n) % 2 == 0:
                    median1 = max(maxLeft1, maxLeft2)
                    median2 = min(minRight1, minRight2)
                    return (median1 + median2) / 2.0
                else:
                    median1 = max(maxLeft1, maxLeft2)
                    return median1
            elif maxLeft1 > minRight2:
                right = partition1 - 1
            else:
                left = partition1 + 1

在循环体中,根据四个值的大小关系判断当前的分隔点是否符合中位数的条件。如果满足条件maxLeft1 <= minRight2maxLeft2 <= minRight1,则说明找到了符合中位数条件的分隔点。

如果(m + n)为偶数,则中位数为(max(maxLeft1, maxLeft2) + min(minRight1, minRight2)) / 2.0

如果(m + n)为奇数,则中位数为max(maxLeft1, maxLeft2)

如果找到了中位数,直接返回中位数。

如果maxLeft1 > minRight2,说明当前的分隔点在nums1中太靠右,需要将右边界right更新为partition1 - 1

否则,说明当前的分隔点在nums1中太靠左,需要将左边界left更新为partition1 + 1

        raise ValueError("Invalid input")

循环结束后,如果没有找到符合条件的分隔点,抛出ValueError异常,表示输入无效。

代码通过二分查找的方式在两个已排序数组中寻找中位数,时间复杂度为O(log(min(m, n))),其中m和n分别为两个数组的长度。

完整代码

在这里插入图片描述

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
            # 如果nums1的长度大于nums2的长度,则交换两个数组,使得nums1成为较短的数组

        m, n = len(nums1), len(nums2)
        left, right = 0, m
        median1, median2 = 0, 0
        # m和n分别表示nums1和nums2的长度,left和right初始化为0和m,median1和median2初始化为0

        while left <= right:
            partition1 = (left + right) // 2
            partition2 = (m + n + 1) // 2 - partition1
            # 计算当前的分割点partition1和partition2
            # 使用二分查找的方法查找中位数

            maxLeft1 = float('-inf') if partition1 == 0 else nums1[partition1 - 1]
            minRight1 = float('inf') if partition1 == m else nums1[partition1]
            # 计算nums1中左侧的最大值和右侧的最小值

            maxLeft2 = float('-inf') if partition2 == 0 else nums2[partition2 - 1]
            minRight2 = float('inf') if partition2 == n else nums2[partition2]
            # 计算nums2中左侧的最大值和右侧的最小值

            if maxLeft1 <= minRight2 and maxLeft2 <= minRight1:
                if (m + n) % 2 == 0:
                    median1 = max(maxLeft1, maxLeft2)
                    median2 = min(minRight1, minRight2)
                    return (median1 + median2) / 2.0
                    # 如果符合中位数条件,且总长度为偶数,返回两个中间值的平均数
                else:
                    median1 = max(maxLeft1, maxLeft2)
                    return median1
                    # 如果符合中位数条件,且总长度为奇数,返回较大的中间值
            elif maxLeft1 > minRight2:
                right = partition1 - 1
                # 当前分割点在nums1中太靠右,更新右边界
            else:
                left = partition1 + 1
                # 当前分割点在nums1中太靠左,更新左边界

        raise ValueError("Invalid input")
        # 没有找到符合条件的分割点,抛出异常表示输入无效


运行效果及示例代码

示例代码1

nums1 = [1, 3]
nums2 = [2]
solution = Solution()
median = solution.findMedianSortedArrays(nums1, nums2)
print("示例1的中位数为:", median)

效果图

在这里插入图片描述

示例代码2

nums1 = [1, 2]
nums2 = [3, 4]
solution = Solution()
median = solution.findMedianSortedArrays(nums1, nums2)
print("示例2的中位数为:", median)

效果图

在这里插入图片描述

完结

在这里插入图片描述

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

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

相关文章

机器学习洞察 | 分布式训练让机器学习更加快速准确

机器学习能够基于数据发现一般化规律的优势日益突显&#xff0c;我们看到有越来越多的开发者关注如何训练出更快速、更准确的机器学习模型&#xff0c;而分布式训练 (Distributed Training) 则能够大幅加速这一进程。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源…

限制远程访问,保障服务器安全,如何指定某台电脑远程本服务器?

好多人都在问&#xff0c;如何限制某台电脑远程访问本服务器是一个必须要解决的问题。下面&#xff0c;我将为大家介绍几种限制远程访问的方法&#xff0c;帮助大家保障服务器的安全性。 1&#xff0e;修改远程桌面端口号 默认情况下&#xff0c;Windows服务器的远程桌面端口号…

时序预测 | Matlab+Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测

时序预测 | MatlabPython实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测 目录 时序预测 | MatlabPython实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于高斯混…

1.Git使用技巧-常用命令3

1.Git使用技巧-常用命令3 文章目录 1.Git使用技巧-常用命令3一、版本分支介绍二、版本控制常用命令例子 三、git 仓库如何使用总结 一、版本分支介绍 分支介绍&#xff1a; Master &#xff1a; 稳定压倒一切&#xff0c;禁止尚review和测试过的代码提交到这个分支上&#xff…

1.2 向量基础

什么是向量 向量的定义 ①向量是有大小和方向的有向线段。 ②向量没有位置&#xff0c;只有大小和方向 ③向量的箭头是向量的结束&#xff0c;尾是向量的开始 ④向量魔术的位移能被认为是宇宙平行的唯一序列 &#xff08;向量的数组不是向量的位置&#xff0c;而是向量在各个维…

C++多线程学习(十七、简单实现线程池)

目录 线程池 设计线程池的关键问题 代码 可能出现的疑问 queue> task; 总结&#xff1a; template auto InsertQueue(T&& t, Args&& ...args)->future;(t(args...))> 总结&#xff1a; ThreadPool(size_t size);构造函数 总结&#xff1…

在SpringBoot中搭建微服务的项目(19版)

1.创建SpringBoot项目 2.删除不需要的,留一个pom文件 3.掉地SpringBoot的版本: <version>2.1.6.RELEASE</version> 4.导入该pom文件 <dependencies> <!-- SpringBoot启动器--><dependency><groupId>org.springframework.boot</g…

关于Redis因OAuth 2.0内存溢出解决方案

一、背景介绍 1.问题简介 本次问题是由OAuth 2.0授权框架&#xff08;用于授权第三方应用程序【客户端】访问受保护的资源。&#xff09;存储在Redis集群中的一个key引起的&#xff1a;client_id_to_access&#xff08;或称为 “client ID to access”&#xff09;通常是指在O…

安全用电管理平台针对电气火灾的解决方案 安科瑞 许敏

摘要&#xff1a; 安全用电管理平台是针对我国当前电气火灾事故频发而设计的一套电气火灾预警和预防管理系统&#xff0c;该系统是基于移动互联网、云计算技术、通过物联网传感终端&#xff08;现场监控模块、传输模块&#xff09;&#xff0c;将供电侧、用电侧电气安全参数实时…

java 打包Spring Boot项目,并运行在windows系统中

前面呢 我们已经把Spring Boot比较基础的东西都弄完了 然后呢 我们来看运维这方面的知识 首先 我们做个打包运行 其实很多人可能会比较熟悉windows系统 而linux服务器 相对没那么了解 那么我们就先来弄windows的 首先 我们要知道 为什么要打包 我们就看我们前面做的MMP项目 当…

git轻量级服务器gogs

确保本真机已启动sshd服务 sudo apt install openssh-server -y sudo systemctl start sshgogs部署 启动 sudo docker stop gogs; sudo docker rm gogs; rm -fr /build/gogs_data/*; sudo docker run --namegogs -p 10022:22 -p 10880:3000 -v /build/gogs_data:/data …

布雷默浪丹 PT 141:189691-06-3,1607799-13-2,Bremelanotide,布美诺肽

Bremelanotide&#xff0c;布雷默浪丹 PT 141&#xff0c;布美诺肽Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;189691-06-3/1607799-13-2 2.Molecular formula&#xff1a;C50H68N14O10 3.Molecular weight&#xff1a;1025.063 4…

抖音seo矩阵系统源码开发部署-技术开源(三)

场景&#xff1a;抖音seo源码。抖音矩阵源码&#xff0c;短视频seo源码&#xff0c;短视频矩阵源码开发部署&#xff0c;技术分享&#xff0c; 一、 抖音seo源码开发所需服务器环境配置 要开发抖音SEO矩阵系统&#xff0c;需要以下服务器环境&#xff1a; Web服务器&#xff…

Jmeter的常用设置(二)【处理乱码问题】

文章目录 前言一、察看结果树响应结果是乱码_解决方法 方法一&#xff1a;在察看结果树之前添加 后置处理器 中的 “BeanShell PostProcessor” 来动态修改结果处理编码方法二&#xff1a;在配置文件中修改二、使用步骤 1.引入库2.读入数据总结 前言 接口测试中遇到的各种问题…

使用 ViteJs 将 Jest 测试集成到现有的 Vue 3 项目中

根据我最近的经验&#xff0c;我面临着将 Jest 测试框架集成到使用Vite构建的现有Vue3 js项目中的挑战。我在各种博客上找到有用的安装指南时遇到了困难。然而&#xff0c;经过多次尝试和付出很大的努力&#xff0c;我最终找到了解决方案。在这篇博文中&#xff0c;我的目标是提…

2023黑马头条.微服务项目.跟学笔记(五)

2023黑马头条.微服务项目.跟学笔记 五 延迟任务精准发布文章1.文章定时发布2.延迟任务概述2.1 什么是延迟任务2.2 技术对比2.2.1 DelayQueue2.2.2 RabbitMQ实现延迟任务2.2.3 redis实现 3.redis实现延迟任务4.延迟任务服务实现4.1 搭建heima-leadnews-schedule模块4.2 数据库准…

Swagger简介及Springboot集成Swagger详细教程

Swagger简介及Springboot集成Swagger详细教程 学习目标 了解Swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger 1、Swagger简介 前后端分离 VueSpringBoot 后端时代 前端只用管理静态页面&#xff1b;html–>后端。模版引擎JSP–>后端是主力 前后端分离式时…

获取mysql存储过程的异常信息

示例 CREATE DEFINERrootlocalhost PROCEDURE getErrorMsg() BEGIN-- 定义存储变量DECLARE code CHAR(5) DEFAULT ;DECLARE msg TEXT;DECLARE result TEXT;-- 声明异常处理DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGIN-- 获取异常code,异常信息GET DIAGNOSTICS CONDITION …

基于单片机的恒温恒湿温室大棚温湿度控制系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前温湿度按键设置温湿度报警上限和下限&#xff1b;温度低于下限继电器闭合加热片进行加热&#xff1b;温度超过上限继电器闭合开启风扇进行降温湿度低于下限继电器闭合加湿器进行加湿湿度高于上限继电器闭合开启风扇进行…

干翻Dubbo系列第三篇:Dubbo术语与第一个应用程序

前言 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽都顺利。 如…