LeetCode4. 寻找两个正序数组的中位数

news2024/10/7 20:29:16

写在前面:

题目链接:LeetCode4. 寻找两个正序数组的中位数
编程语言:C++
题目难度:困难

一、题目描述

给定两个大小分别为 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

二、题目分析&解题思路&代码实现

2.1 归并法

看到这样的描述,大家应该很快想到了归并排序的原理,如果这里对归并排序不太了解的可以参考以下博客:
十大排序算法思路&代码实现(持续更新中)
或者也可以直接看下面的解题思路:
两个有序数组
1 , 3
2 , 4
我们只需要新建一个 vector ,然后分别从两个数组,从头到尾数组元素挨个进行比较小的就插入

        vector<int> vctResult;
        int i = 0;
        int j = 0;
        while(i< nums1.size() && j < nums2.size())
        {
            while((i < nums1.size()) && (j < nums2.size()) && nums1[i] <= nums2[j])//这里一定要注意数组越界问题
            {
            	//小的插入
                vctResult.push_back(nums1[i]);
                i++;
            }
            while((i < nums1.size()) && (j < nums2.size()) && nums2[j] <= nums1[i])
            {
                vctResult.push_back(nums2[j]);
                j++;
            }

        }
        //如果两个数组size 不相等,那么剩下的肯定就是大的数,直接插入即可
        while(i < nums1.size())
        {
            vctResult.push_back(nums1[i]);
            i++;
        }
        while(j < nums2.size())
        {
            vctResult.push_back(nums2[j]);
            j++;
        }

最后构建出一个新的数组:
1 , 2 , 3 ,4
接着我们只需要判断数组的 size 是基数还是偶数即可:

		int mid = (nums1.size() + nums2.size())/2;
        if(vctResult.size()%2==0)
        {
        	//偶数取中间两个 除以 2.0(注意返回值为 double)
            dResult = (vctResult[mid] + vctResult[mid-1])/2.0;
        }
        else
        {
        	//奇数取中间一位即可
            dResult = vctResult[mid];
        }

2.1.1 完整代码示例:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double dResult = 0.0;
        int mid = 0;
        mid = (nums1.size() + nums2.size())/2;
        vector<int> vctResult;//合并后的新数组
        int i = 0;
        int j = 0;
        while(i< nums1.size() && j < nums2.size())
        {
            while((i < nums1.size()) && (j < nums2.size()) && nums1[i] <= nums2[j])//这里一定要注意数组越界问题
            {
            	//小的插入
                vctResult.push_back(nums1[i]);
                i++;
            }
            while((i < nums1.size()) && (j < nums2.size()) && nums2[j] <= nums1[i])
            {
                vctResult.push_back(nums2[j]);
                j++;
            }

        }
        //如果两个数组size 不相等,那么剩下的肯定就是大的数,直接插入即可
        while(i < nums1.size())
        {
            vctResult.push_back(nums1[i]);
            i++;
        }
        while(j < nums2.size())
        {
            vctResult.push_back(nums2[j]);
            j++;
        }
        if(vctResult.size()%2==0)
        {
        	//偶数取中间两个 除以 2.0(注意返回值为 double)
            dResult = (vctResult[mid] + vctResult[mid-1])/2.0;
        }
        else
        {
        	//奇数取中间一位即可
            dResult = vctResult[mid];
        }
    return dResult;
    }
};

2.1.2 运行结果:

在这里插入图片描述
这里也是通过了,复杂度也是O(m+n) ,但同时也开辟了O(m+n)的空间,空间复杂度较高;

2.1.3 归并优化

这一步还可以再做优化,因为我们只需要合并到 新的数组size > mid 即可,后面的也不需要遍历,也不要再合并了,因此可以,将时间复杂度和空间复杂度都降低一半为:O(1/2(m+n))

代码示例:

class Solution {
public:
    bool isMidFind(vector<int>& vctResult, int& mid, double&dResult,int& size)
    {
        if(vctResult.size() > mid)
        {
            if(size %2 == 0)//偶数取中间两位
            {
                dResult = (vctResult[mid] + vctResult[mid-1])/2.0;
            }
            else//奇数直接取即可
            {
                dResult = vctResult[mid];
            }
            return true;
        }
        else
        {
            return false;
        }

    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double dResult = 0.0;
        int mid = 0;
        mid = (nums1.size() + nums2.size())/2;
        int size = nums1.size() + nums2.size();
        vector<int> vctResult;//合并后的新数组
        int i = 0;
        int j = 0;
        while(i< nums1.size() && j < nums2.size())
        {
            while((i < nums1.size()) && (j < nums2.size()) && nums1[i] <= nums2[j])//这里一定要注意数组越界问题
            {
            	//小的数插入
                vctResult.push_back(nums1[i]);
                if(isMidFind(vctResult, mid,dResult,size))
                {	
                	//找到了直接return 即可
                    return dResult;
                }
                i++;
            }
            while((i < nums1.size()) && (j < nums2.size()) && nums2[j] <= nums1[i])
            {
                vctResult.push_back(nums2[j]);
                if(isMidFind(vctResult, mid,dResult,size))
                {
                    return dResult;
                }
                j++;
            }

        }
        //如果两个数组size 不相等,那么剩下的肯定就是大的数,直接插入即可
        while(i < nums1.size())
        {
            vctResult.push_back(nums1[i]);
            if(isMidFind(vctResult, mid,dResult,size))
            {
                return dResult;
            }
            i++;
        }
        while(j < nums2.size())
        {
            vctResult.push_back(nums2[j]);
            if(isMidFind(vctResult, mid,dResult,size))
            {
                return dResult;
            }
            j++;
        }

    return dResult;
    }
};

2.1.3.1 运行结果

在这里插入图片描述
可以看到时间和空间复杂度都有所降低。

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

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

相关文章

英文论文润色哪家好用比较好,有值得推荐的吗

英文论文润色 推荐 英文论文润色对于写作者来说是一项十分重要的任务&#xff0c;它可以帮助我们修改文章中的语法、标点和排版等问题&#xff0c;使论文更加准确和易读。在众多的英文润色软件中&#xff0c;147chatgpt改写润色软件是一款值得推荐的全自动批量图文润色、自动纠…

SSM框架学习-核心容器小结

1. 容器相关 Spring核心容器中的容器是指容器对象&#xff0c;用于管理和装配Bean。它主要包含以下四个容器&#xff1a; BeanFactory容器&#xff1a;是最简单的容器&#xff0c;提供实例化、配置和管理对象的基本功能&#xff0c;但不提供AOP、事务管理等高级功能。 Applica…

三分钟,带你了解零代码开发

企业数字化转型如火如荼的进行&#xff0c;五花八门的零代码、低代码工具正如雨后春笋一般出现&#xff0c;那么零代码开发是什么&#xff1f; 阅读本文您将了解&#xff1a; 零代码开发是什么零代码与企业数字化转型零代码开发带来的效益简道云零代码平台应用实例 一、零代…

3ds Max云渲染有多快,3ds Max云渲染怎么用?

本地渲染效果图和动画3D项目是一个非常耗时的过程&#xff0c;当在场景中使用未优化的几何体或在最终渲染中使用大量多边形模型时&#xff0c;诸如此类的变量最终会增加渲染项目所需的时间和处理器能力。随着提供的渲染服务的云渲染平台出现&#xff0c;越来越多动画师、艺术家…

【ChirpStack 】如何获取 JWT TOKEN并利用 API 下发数据?

LoRa App Server 提供了两类 API 接口&#xff0c;其中 RESTful JSON API 提供了一个 API console&#xff0c;在AS地址的基础上使用 /api 即可访问&#xff0c;罗列了 API 端点和文档介绍&#xff0c;测试起来非常方便。 本文主要介绍 如何使用 chirpstack 的API 进行测试以及…

日常问题----如和解决跨域

一、什么是跨域 跨域不是问题&#xff0c;是一种安全机制。 同源策略是浏览器一个重要的安全策略&#xff0c;一个url由三部分组成:协议&#xff0c;域名&#xff08;ip地址&#xff09;&#xff0c;端口。所谓的同源就是指两个域有相同的协议&#xff08;protocol&#xff09…

7种常见的生产级负载均衡算法

准备测试数据 package com.example.demo.balance;import java.util.*;/*** author liwenchao*/ public class ServerIps {public static final List<String> LIST Arrays.asList("192.168.0.1","192.168.0.2","192.168.0.3","192.1…

聊聊那些年我们实现java AOP几种常见套路

前言 有一定开发经验的同学对AOP应该很了解吧&#xff0c;如果不了解&#xff0c;可以先查看如下文章进行科普一下https://baike.baidu.com/item/AOP/1332219?fraladdin&#xff0c;再来阅读本文。 示例前置准备 注&#xff1a; 本示例基于springboot进行演示 1、在项目pom…

将ABC文件 通过BlendShape导出为FBX>

将ABC文件 通过BlendShape导出为FBX 一、应用场景&#xff1a; 此项目为高中化学实验案例&#xff0c;为实现保鲜膜 模拟动画&#xff0c;这里通过使用MarvelousDesigner来结算出动画效果&#xff0c;导出ABC格式带动画后&#xff0c;导入到maya当中&#xff0c;这里因为需要…

SSM框架学习-注解开发定义bean

注解开发定义的bean和xml文件定义的bean有以下区别&#xff1a; 配置方式不同&#xff1a;注解方式是直接在Java类中使用注解来定义bean&#xff0c;而XML方式则是在XML文件中配置bean。 配置信息不同&#xff1a;注解方式在注解内配置bean的属性&#xff0c;如Value&#xff…

springboot整合ES

也可以直接看到最后&#xff0c;直接看到最后&#xff0c;中间都是废话废话废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;好气啊 1.刚下载完成,输入localhost:9200就报错&#xff0c;整个人都不太好了 [2023-05-10T14:35:59,002][WARN ][o.…

DC域控服务器与辅助DC域控服务器创建

DC域控服务器与辅助DC域控服务器创建 一、准备条件 在虚拟机上准备三台Windows Server 2008 R2 ,一台作为主域控&#xff0c;一台作为额外域控辅域控&#xff0c;一台作为客户端。 主域控 的IP地址为--192.168.1.190, 注意&#xff1a;(Windows Server 2003 需要 设置 DNS为127…

烽火HG680KA-Hi3798MV310-当贝纯净桌面-卡刷固件包

烽火HG680KA-Hi3798MV310-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff…

pytorch搭建EfficientnetV2网络

文章目录 前言一、EfficientnetV2二、网络结构1.Fused_MBConv2.MBConv 三、整体代码总结 论文地址&#xff1a;https://arxiv.org/abs/2104.00298 官方代码&#xff1a;https://github.com/google/automl/tree/master/efficientnetv2 参考链接&#xff1a;https://blog.csdn.ne…

经典:DotNetBar Suite UI 7.9 for WPF Crack

创建专业的 WPF 应用程序 DotNetBar Suite for WPF 是超过 38 个本机 Windows Presentation Foundation 控件的工具箱&#xff0c;用于创建专业的 WPF 应用程序。 Office 2016 类样式添加到功能区、日程安排和其他控件... 我们痴迷于控制性能和像素级细节。我们很自豪地说&…

2023年杭州助理工程师职称申报评审流程是什么呢?社保单位不一致怎么办?

助理工程师证&#xff0c;又称为初级工程证或者初级职称。助理工程师&#xff0c;是指初级工程技术人员的职务名称。有了助理工程师证你可以评中级工程师证&#xff0c;也可以应聘、在职、上岗、加薪、企业升资质和招投标都用的到。助理工程师证是评审获得的&#xff0c;评审报…

如何正确使用 Facebook 反链,增强网站在搜索引擎中的曝光度

在当今数字化时代&#xff0c;拥有一个强大的在线存在感是企业成功的关键之一。而在建立有效的在线存在感时&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;扮演着重要的角色。而其中一个重要的SEO策略是利用反链来增强网站在搜索引擎中的曝光度。 然而&#xff0c;许多…

【服务器数据恢复】HP双循环Raid5磁盘阵列数据恢复案例

服务器数据恢复环境&#xff1a; 一台HP DL系列服务器&#xff0c;通过hp smart array控制器挂载一台磁盘阵列设备&#xff0c;作为公司内部的文件服务器使用&#xff1b; 该磁盘阵列设备中有一组由十几块SCSI硬盘组建的RAID5&#xff1b; 上层安装LINUX操作系统并部署了NFSFTP…

结算更高效,成本更节省,风控更全面,用友银企联助力万家企业加速数字变革

数字经济蓬勃发展的当下&#xff0c;在业绩增长和管理提效的双重压力下&#xff0c;企业纷纷投身于数字化、智能化转型升级&#xff0c;通过大数据及新一代人工智能技术寻求产业变革&#xff0c;以实现企业业务创新与管控升级。银企联作为企业与银行信息交互的通道&#xff0c;…

SpringBoot——pom文件:parent

先看一看&#xff1a; 本次我们主要介绍SpringBoot的文件&#xff0c;先来看一看里面都有什么内容&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!--XML文件的抬头--> <!--一些约束以及明明空间信息--> <project xmlns&qu…