4. 寻找两个正序数组的中位数
1. 题目
见 寻找两个正序数组的中位数
2. 解题思路
首先一看到题目说是正序数组,且时间复杂度要求在对数级别,所以自然想到了双指针中的二分法。

首先来看一下,假设输入是这两个数组,那么将其逻辑合并成一个大数组的话,分界线左边为大数组的左边,右边同理。这个数组又是升序的,且原来的两个数组是升序的(即L1<=R1& L2<=R2)。所以在大数组中,L1<=R2 & L2<=R1
所以这里就得到了第一个约束:切割后的中位线要满足交叉小于等于。
然后大数组的中位数呢,就是从中位数左边选择一个大的数字(Max(L1,L2))和右边选一个小的数字(Min(R1,R2))来进行计算。
上面的情况是刚好属于一个逻辑合并数组并且划分中位线后 满足交叉小于的情况,假如像下图划分中位线后不满足交叉小于呢?

因为L2>R1了,所以我们右移R1,直到比L2大,满足交叉小于等于。

这个时候会奇怪了,为什么要移动nums2的中位线?
因为此时我们做了一个逻辑合并数组的设想,所以整个大数组中位线两边的元素应该尽量保持相同。
R1移动后nums1中位线左边有5个元素,所以同理移动nums2的中位线,让它的右边也有5个元素。
另外需要注意的是:
1、我们默认只对nums1进行操作,由nums1的操作计算出对nums2的操作。比如 假如不符合交叉小于等于,那么我们就移动nums1的中位线,然后由公式算出nums2的中位线即可。
2、当数组为奇数的时候我们默认把中位线划分在右边一点(左边也是可以的)

上面说的是两个数组都是偶数的情况,假如有个数字为奇数呢?

因为数组是有序的,且满足交叉小于等于,且奇数数组的中位数都是划分在右边的(我们约定的),单拎出来nums2看的话,中位数是中位线左边的那个。所以最后逻辑合并大数组了,中位数只要在大数组中位线左边取偏大的就行了。也就是max(L1,L2)
3. 代码
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {//保持数组长度小的在前面,节省性能if (nums1.length > nums2.length) {return findMedianSortedArrays(nums2, nums1);}int m = nums1.length;int n = nums2.length;int left = 0, right = m;int median1 = 0, median2 = 0;while (left <= right) {//确定第一个数组的分割线median1 = (left + right) / 2;//确定第二个数组的分割线median2 = (m + n + 1) / 2 - median1;//数组1中位分割线左边的数int L1= (median1 == 0 ? Integer.MIN_VALUE : nums1[median1 - 1]);//数组1中位分割线右边的数int R1= (median1 == m ? Integer.MAX_VALUE : nums1[median1]);//数组2中位分割线左边的数int L2= (median2 == 0 ? Integer.MIN_VALUE : nums2[median2 - 1]);//数组2中位分割线右边的数int R2= (median2 == n ? Integer.MAX_VALUE : nums2[median2]);int nums_j = (median2 == n ? Integer.MAX_VALUE : nums2[median2]);if (L1 > R2) {//不符合交叉小于等于 继续二分(左移中位线)right = median1-1;} else if (L2 > R1) {//不符合交叉小于等于 继续二分(右移中位线)left = median1 + 1;} else {//将所有的数合并后,如果是偶数个数,中位数是中间两个数的平均值,如果是奇数个数,中位数是大的数return (m + n) % 2 == 0 ? (Math.max(L1, L2) + Math.min(R1, R2)) / 2.0 : Math.max(L1, L2);}}return 0.0;}}
相关文章:
4. 寻找两个正序数组的中位数
1. 题目 见 寻找两个正序数组的中位数 2. 解题思路 首先一看到题目说是正序数组,且时间复杂度要求在对数级别,所以自然想到了双指针中的二分法。 首先来看一下,假设输入是这两个数组,那么将其逻辑合并成一个大数组的话&#x…...
Stable Diffusion AI绘图
提示词: masterpiece, best quality, 1girl, (anime), (manga), (2D), half body, perfect eyes, both eyes are the same, Global illumination, soft light, dream light, digital painting, extremely detailed CGI anime, hd, 2k, 4k background 反向提示词&…...
MR混合现实情景实训教学系统在旅游管理专业中的应用
在旅游管理专业中,MR混合现实情景实训教学系统的主要应用包括但不限于以下几个方面: 1. 实地考察的替代:对于一些无法实地考察的景点或设施,学生可以通过MR系统进行虚拟参观,从而了解其实际情况。这不仅可以减少时间和…...
CentOS 使用线程库Pthread 库
1、Pthread 库说明 pthread 库是Linux系统默认线程库。 在Linux 系统环境中,编辑C/C程序使用pthread 库,需要添加对应的头文件,并链接pthread库。 #include<pthread.h> 2、Pthread 库核心方法 pthread_create 函数定义࿱…...
#力扣:LCP 01. 猜数字@FDDLC
LCP 01. 猜数字 - 力扣(LeetCode) 一、Java class Solution {public int game(int[] guess, int[] answer) {int cnt0;for(int i0;i<3;i){if(guess[i]answer[i])cnt;}return cnt;} }...
kafka丢数据的原因
目录 背景kafkaClient代码消息丢失的可能原因broker is downRD_KAFKA_MSG_SIZE_TOO_LARGE分区问题Kafka Broker的处理能力无法跟上,可能会出现以下情况 Some基础知识补充 背景 采用的client是librdkafka,在producerClient Send的数据时候发现会有数据丢…...
音视频编解码技术学习笔记
音视频编解码技术是音视频处理领域的重要部分,涉及到对原始音视频数据的压缩、编码和解码。以下是音视频编解码技术的一些要点和难点: 要点: 压缩技术 音视频编解码的核心是对原始音视频数据进行压缩,以减小文件大小和传输带宽…...
[C#基础训练]FoodRobot食品管理部分代码-1
代码参考: using System;namespace FoodRobotDemo { public class FoodRobot{private int[] foodCountArr;private string[] foodNameArr;public FoodRobot(){foodCountArr new int[3];foodNameArr new string[3] {"航天","航空","宇航" };}…...
YModem协议总结
《YModem协议总结》 目录 第1章 YModem协议简介 4 1.1 基本介绍 4 1.2 YModem基本介绍 4 第2章 YModem传输协议 5 2.1 起始帧的数据格式 5 2.2 数据帧的数据格式 5 2.3 结束帧数据结构 6 2.4 文件传输过程 6 2.5 CRC的计算 7 附录A 附录 8 A.1 附录 8 第1章 YModem协议简…...
ElasticSearch(ES)8.1及Kibana在docker环境下如何安装
ES基本信息介绍 Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,最初由Elastic公司创建。它属于Elastic Stack(ELK Stack)的核心组件之一,用于实时地存储、检索和分析大量数据。 以下是Elastics…...
常用Win32 API的简单介绍
目录 前言: 控制控制台程序窗口的指令: system函数: COORD函数: GetStdHandle函数: GetConsoleCursorInfo函数: CONSOLE_CURSOR_INFO函数: SetConsoleCursorInfo函数: SetC…...
VM及WindowsServer安装
目录 一.操作系统的简介及常用的操作系统 二.windows的安装 安装VMWare虚拟机 注意点一 编辑 注意点二 三.安装配置Windows Server 2012 R2 四、虚拟机的环境配置及连接 1. 主机连接虚拟机 2. 虚拟机环境配置及共享 3. 环境配置 一.操作系统的简介及常用的操作系…...
操作系统【OS】调度算法对比图
FCFS SJF 高响应比 时间片轮转 多级反馈队列 可抢占? √ √ √ 队列内算法不一定 不可抢占? √ √ √ 队列内算法不一定 特点&优点 公平实现简单有利于长作业不利于短作业有利于CPU繁忙作业不利于IO繁忙作业 因为CPU繁忙型进程即…...
音视频开发常见问题(五):视频黑屏
摘要 本文介绍了视频黑屏的可能原因和解决方案。主要原因包括用户主动关闭视频、网络问题和渲染问题。解决方案包括优化网络稳定性、确保视频渲染视图设置正确、提供清晰的提示、实时监测网络质量、使用详细的日志系统、开启视频预览功能、使用视频流回调、处理编解码问题、处…...
力扣 第 368 场周赛
2908. 元素和最小的山形三元组 I 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件,则认为它是一个 山形三元组 : i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的…...
文件的常用操作(读取压缩文件、解压、删除)
背景:最近做一个腾讯 cos 桶 文件的读写与本地数据库查询等操作 Retrofit 中文件下载的可以添加 Streaming StreamingGETObservable<ResponseBody> downloadCosFile(Url String downloadUrl);Streaming 的作用: 注解通常用于指示Retrofit或其他HTT…...
Simulation Studio - TRNSYS
简单记录一下最近学习 Simulation Studio的一些经历。 在学习之初,参考了一些大佬们的文章: Fortran学习笔记——1.基本内容 - 知乎 但是我主要的目的是使用Simulation Studio(下文用SS代替)编译自己的组件,看到Sim…...
python实现串口通信
python实现串口通信是一件简单的事情,只要通过pyserial模块就可以实现。 一、串口通信 1、什么是串口通信? 串口通信是一种通过串行接口(Serial Port)进行数据传输的通信方式。在串口通信中,数据位按顺序一位一位地传…...
No module named ‘cv2’ 解决方法
目录 解决方案1解决方案2 解决方案1 一般情况下的解决方案 在自己的虚拟环境里面安装就行 pip install opencv-python解决方案2 但是我遇到的情况没有这么简单,我使用了pip list | grep open 搜索含有open字样的opencv的包,结果显示已经安装了 我直接进入我的自定义的虚拟…...
65、内网安全-域环境工作组局域网探针方案
目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击,直接进去,然后再去攻击内网,那么攻击的对象一…...
OpenClaw本地部署指南:千问3.5-9B接口配置与调试技巧
OpenClaw本地部署指南:千问3.5-9B接口配置与调试技巧 1. 为什么选择OpenClaw千问3.5-9B组合 去年我在尝试自动化处理日常工作报告时,发现市面上的RPA工具要么功能臃肿,要么需要将数据上传到云端处理。直到遇到OpenClaw这个开源框架…...
告别杂乱原理图!手把手教你用PDFCreator+Ghostscript为OrCAD 16.6原理图生成带导航书签的PDF
告别杂乱原理图!手把手教你用PDFCreatorGhostscript为OrCAD 16.6原理图生成带导航书签的PDF 硬件工程师的日常工作中,原理图评审是绕不开的环节。但你是否遇到过这样的场景:当你将精心设计的OrCAD原理图导出为PDF分享给团队时,软件…...
SI4463射频项目实战:我是如何用WDS3配置工具搞定868MHz双向通信的
SI4463射频项目实战:从WDS3配置到868MHz双向通信的完整实现 在物联网设备开发中,稳定可靠的无线通信是实现设备互联的关键。SI4463作为Silicon Labs推出的一款高性能Sub-GHz射频芯片,凭借其低功耗、高灵敏度和灵活的配置选项,成为…...
终极装备管理革命:TQVaultAE如何彻底改变《泰坦之旅》游戏体验
终极装备管理革命:TQVaultAE如何彻底改变《泰坦之旅》游戏体验 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE TQVaultAE是《泰坦之旅周年纪念版》的终极外部工具…...
嵌入式系统架构和微处理器深入分析和总结
嵌入式系统架构和微处理器深入分析与总结 嵌入式系统的核心是架构与微处理器的有机结合。架构定义了系统的“思维方式和规则”,而微处理器则是执行这些规则的“物理引擎”。 第一部分:嵌入式系统架构 嵌入式系统架构是指系统的结构、组件及其相互关系的宏观设计。它决定了系…...
PvZ Toolkit:植物大战僵尸玩家的开源游戏增强助手
PvZ Toolkit:植物大战僵尸玩家的开源游戏增强助手 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 当你在植物大战僵尸的无尽模式中苦苦支撑,阳光不足导致防线崩溃时…...
Phi-4-mini-reasoning真实作品:微分方程求解+物理意义解释双模态输出
Phi-4-mini-reasoning真实作品:微分方程求解物理意义解释双模态输出 1. 模型简介 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它经过专门微调以提升数学…...
ERNIE-4.5-0.3B-PT医疗问答系统开发:从模型部署到前后端集成
ERNIE-4.5-0.3B-PT医疗问答系统开发:从模型部署到前后端集成 1. 医疗问答系统的价值与挑战 医疗咨询是每个人都会遇到的实际需求,但专业医疗资源有限,很多时候我们只是需要一些基础的医疗建议和健康指导。传统的医疗问答系统往往依赖规则匹…...
藏在OpenBMC里的黑科技:拆解dbus-broker如何用socketpair实现父子进程通信
藏在OpenBMC里的黑科技:拆解dbus-broker如何用socketpair实现父子进程通信 在嵌入式系统开发领域,OpenBMC作为开源基板管理控制器解决方案,其底层通信机制的设计往往蕴含着许多精妙的技术细节。今天我们将深入探讨dbus-broker中那个鲜为人知…...
嵌入式 AI 助手的三层意图识别架构:如何在“快、准、稳“之间取得平衡
背景 我在开发一个项目协同平台的嵌入式 AI 助手。它不是独立的 chatbot,而是嵌在业务页面里的——用户可以在首页、项目详情页、任务抽屉等不同位置唤起它,用自然语言完成任务查询、创建、删除等操作。 和通用对话 AI 不同,这个助手有两个硬…...
