LeetCode:4. 寻找两个正序数组的中位数

news2025/3/5 2:19:20
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

题解目录

  • 一、🌱[4. 寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/)
    • 🌴解题
      • 1.直接查找中位数
      • 2.二分法


一、🌱4. 寻找两个正序数组的中位数

  • 题目描述:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n))

  • 来源:力扣(LeetCode)

  • 难度:困难

  • 示例 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.直接查找中位数

最简单的方法就是两个数组按大小顺序合并,找出中间的数。而实际上我们知道两个数组长度之和 m+n = Length,只需要按大小遍历两个数组的值,找到【第 Length 个(奇数)】or【第Length-1 个和 Length 个(偶数)】即可,就不用增加一个数组空间。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int tag=1;
        int p=(nums1.length+nums2.length)/2-1;
        if((nums1.length+nums2.length)%2==0)
            tag=2;
        int a = -1,b=-1;
        int index1=0,index2=0;
        for (int i = 0; i <= p+1; i++) {
            if(index1<nums1.length&&index2< nums2.length){
                if(nums1[index1]<=nums2[index2]){
                    if(i==p&&tag==2)
                        a=nums1[index1];
                    else if(i==p+1)
                        b=nums1[index1];
                    index1++;
                }
                else{
                    if(i==p&&tag==2)
                        a=nums2[index2];
                    else if(i==p+1)
                        b=nums2[index2];
                    index2++;
                }
            }
            else if(index1>=nums1.length&&index2< nums2.length){
                if(i==p&&tag==2)
                    a=nums2[index2];
                else if(i==p+1)
                    b=nums2[index2];
                index2++;
            }
            else{
                if(i==p&&tag==2)
                    a=nums1[index1];
                else if(i==p+1)
                    b=nums1[index1];
                index1++;
            }
        }

        return tag==2?(a+b)/2.0:b;
    }
}

在这里插入图片描述

但是这样的时间复杂度仍然是O(m+n),不满足题目要求。对于log的时间复杂度,容易想到二分法查找。

2.二分法

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int n = nums1.length;
    int m = nums2.length;
    int left = (n + m + 1) / 2;
    int right = (n + m + 2) / 2;   
    return (getKth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getKth(nums1, 0, n - 1, nums2, 0, m - 1, right)) * 0.5;  
}
    
private int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) {
    int len1 = end1 - start1 + 1;
    int len2 = end2 - start2 + 1;   
    if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k);
    if (len1 == 0) return nums2[start2 + k - 1];
    if (k == 1) return Math.min(nums1[start1], nums2[start2]);
    int i = start1 + Math.min(len1, k / 2) - 1;
    int j = start2 + Math.min(len2, k / 2) - 1;
    if (nums1[i] > nums2[j]) {
        return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));
    }
    else {
        return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));
    }
}

在这里插入图片描述
【参考LeetCode官方题解】


🌵 物华天宝,龙光射牛斗之墟; 人杰地灵,徐孺下陈蕃之榻。

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

微信朋友圈同步你知道怎么设置吗?

微信关于朋友圈同步 其实没有什么其他方法 但是不想一直复制粘贴 繁琐又麻烦 对于要发布很多条的情况下 就很不方便 如果是有可以同步朋友圈的功能 我们可以先选择一个好友 然后设置好跟圈任务 好友发啥你就会跟TA发出一模一样的朋友圈

CEASC项目环境搭建(训练VisDrone数据集)

CEASC项目环境搭建&#xff08;训练VisDrone数据集&#xff09; 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Du_Adaptive_Sparse_Convolutional_Networks_With_Global_Context_Enhancement_for_Faster_CVPR_2023_paper.pdf Code&#xff1a…

同比环比数据可视化

引言 数据分析和可视化在现代商业环境中变得越来越重要。随着数据的迅速增长&#xff0c;我们需要有效的工具来解释和理解这些数据。 数据可视化提供了一种直观的方式&#xff0c;帮助我们从海量数据中提取有意义的见解&#xff0c;以支持业务决策。 同比环比图作为一种常见的…

AI制图工具丨Midjourney产品功能介绍

了解如何使用Discord上的Midjourney Bot通过简单的文本提示创建自定义图像 Midjourney是一款AI制图工具&#xff0c;只要关键字&#xff0c;就能透过AI算法生成相对应的图片&#xff0c;只需要不到一分钟。 可以选择不同画家的艺术风格&#xff0c;例如安迪华荷、达芬奇、达利…

JavaScript中的JSON

一&#xff1a;分类  简单值&#xff1a;字符串、数值、布尔值和 null 可以在 JSON 中出现&#xff0c;就像在 JavaScript 中一样。特殊 值 undefined 不可以。 对象&#xff1a;第一种复杂数据类型&#xff0c;对象表示有序键/值对。每个值可以是简单值&#xff0c;也可以…

如何通过三级缓存解决 Spring 循环依赖

以下内容基于 Spring6.0.4。 这个其实是一个特别高频的面试题&#xff0c;松哥也一直很想和大家仔细来聊一聊这个话题&#xff0c;网上关于这块的文章很多&#xff0c;但是我一直觉得要把这个问题讲清楚还有点难度&#xff0c;今天我来试一试&#xff0c;看能不能和小伙伴们把…

一张证,三年月薪翻三倍!

18年9月&#xff0c;我获取了PMP&#xff08;项目管理&#xff09;认证&#xff0c;19年6月获取了PgMP&#xff08;项目集群管理&#xff09;认证。考证过程并不是很难&#xff0c;月薪却从1万突破3万&#xff0c;也找到了自己喜欢和擅长的工作领域&#xff0c;获益无穷。 什么…

Navicat 用户权限功能 | 预防 MySQL 删库风险

近期&#xff0c;我们后台收到一位用户的问询&#xff0c;有关于误删库的解决办法。对于企业来说&#xff0c;这可能是一个大事故&#xff01;但幸运的是&#xff0c;该用户在不久之前看了我们的 Navicat 自动备份功能文章&#xff0c;并且实施了数据库备份操作&#xff0c;所以…

如何下载SRA存放在AWS的原始数据

通常&#xff0c;我们都是利用prefetch从NCBI上获取数据&#xff0c;然后用fasterp-dump/fastq-dump 转成fastq。但遗憾的SRA的数据是原数据的有损压缩&#xff0c;比如说我19年参与发表的文章里单细胞数据上传的是3个文件&#xff0c;但是当时的faster-dump/fastq-dump只能拆出…

MongoDB源码安装

文章目录 MongoDB源码安装&#xff1a;注&#xff1a;下载&#xff1a;解压&#xff1a;创建数据目录&#xff1a;创建软链接&#xff1a;创建变量脚本&#xff1a;执行脚本&#xff1a;启动mongodb:检查&#xff1a;连接mongodb&#xff1a; MongoDB源码安装&#xff1a; 注&…

Flutter系列文章-Flutter基础

Flutter是Google推出的一种新的移动应用开发框架&#xff0c;允许开发者使用一套代码库同时开发Android和iOS应用。它的设计理念、框架结构、以及对Widget的使用&#xff0c;都让开发者能更有效率地创建高质量的应用。 一、Flutter设计理念 Flutter的设计理念是“一切皆为Wid…

安装hive数据仓库

部署hive数据库 环境准备 需要安装部署完成的Hadoop的环境如果不会搭建的可以参考&#xff1a; 安装mysql 卸载Centos7自带的mariadb rpm -qa|grep mariadbrpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodepsrpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64是使用…

ToT: 利用大语言模型进行有意识的问题解决(上)

ToT 摘要介绍利用大语言模型进行有意识的问题解决1. 思维分解2. 思维产生 G(p,s,k)3. 状态评估V(p,S)4. 搜索算法 实验相关工作讨论 原文&#xff1a; 摘要 语言模型正在迅速成为一般问题解决的部署&#xff0c;但在推理过程中仍然局限于 标记级别&#xff08;token-level&…

uniapp左右滑动切换月份

左右滑动触发事件 给组件绑定事件,主要利用组件的触摸开始和触摸结束事件来实现: <view @touchstart="touchStart" @touchend="touchEnd"> 2,声明初始化点击位置变量startX data() {return {list:[],pageNum:1,pageSize:10,//初始化点击位置…

手撕Spring06

概述 该章节通过各种Context解决上下文问题&#xff0c;使用模版方法的设计模式&#xff0c;并增加了bean实例化之前、beanc初始化前后的扩展点整体设计 知识点补充 类图 context context包下主要是传递上下文、调用core.io、beans等包下的实际功能完成&#xff0c;配置文件…

12.11 FS4412开发环境搭建

目录 开发边硬件资源介绍 地址映射表 硬件控制原理 load/store 地址映射表4个G包括 开发边硬件资源介绍 地址映射表 硬件控制原理 1.数据运算指令&#xff08;CPU内部&#xff09; 2.跳转指令&#xff08;CPU内部&#xff09; 3.load/store&#xff08;通过读写对硬件…

测试的基本概念(测试系列2)

目录 前言&#xff1a; 1.什么是需求 1.1需求的定义 1.2为什么有软件需求 1.3测试人眼里的需求 2测试用例 2.1什么是测试用例 2.2为什么要有测试用例 3.软件错误&#xff08;BUG&#xff09; 3.1什么是bug 4.软件的生命周期 5.开发模型 5.1瀑布模型 5.2螺旋模型 …

【PHP源码】手术麻醉管理系统介绍

手术麻醉管理系统是什么&#xff1f; 手术麻醉信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批、安…

c#语法问题记录

1.using using 语句定义一个范围&#xff0c;在此范围的末尾将释放对象。using 指令为命名空间创建别名&#xff0c;或导入在其他命名空间中定义的类型。 2. internal sealed partial class internal&#xff1a; 关键字是类型和类型成员的访问修饰符。sealed &#xff1a;应…

IndexDB完整使用指南

IndexDB完整使用指南 数据存储是大多数 Web 应用程序的重要组成部分&#xff0c;从跟踪用户数据到应用程序数据。随着更快、更强大的 Web 应用程序的快速开发&#xff0c;需要高效的客户端存储来帮助开发。 多年来&#xff0c;Web 上的客户端存储已经发生了很大的变化&#x…