LeetCode 力扣: 寻找两个正序数组的中位数 (Javascript)
LeetCode力扣双指针题目
主要提供了力扣热题第四题,使用js,复杂度O(log(m+n)),寻找两个正序数组的中位数。
题目解析
题目要求在两个已排序数组 nums1 和 nums2 中找到它们的中位数。为了满足时间复杂度要求 O(log (m+n)),可以采用双指针的方法合并这两个数组,然后计算中位数。
思路
首先,代码检查 nums1 和 nums2 的长度,确保 nums1 总是较短的数组。如果 nums1 的长度大于 nums2,则通过递归调用 findMedianSortedArrays 函数,将它们的顺序反转,以确保 nums1 始终是较短的数组。
获取 nums1 和 nums2 的长度,分别赋值给 x 和 y。
初始化两个指针 low 和 high,它们将用于执行二分查找。low 初始为0,high 初始为 x,即 nums1 的长度。
进入一个循环,循环条件是 low 小于等于 high。
在每次循环迭代中,计算 partitionX 和 partitionY,这两个值将用于将数组分成左右两部分。partitionX 表示将 nums1 分成左右两部分的分界点,而 partitionY 表示将 nums2 分成左右两部分的分界点。这些分界点是通过位运算和数组长度计算得出的。
根据分界点,获取左右两部分的最大值和最小值。maxX 和 minX 表示 nums1 中左右两部分的最大值和最小值,而 maxY 和 minY 表示 nums2 中左右两部分的最大值和最小值。
接着,代码检查最大值和最小值是否满足中位数的条件,即 maxX <= minY 和 maxY <= minX。如果满足这些条件,说明找到了中位数的位置。
如果总元素个数是偶数((x + y) % 2 === 0),则中位数是左右两部分的最大值和最小值的平均数;如果总元素个数是奇数,中位数是最大值中的较大值。
如果没有找到中位数的位置,根据情况更新 low 或 high,以继续二分查找。
最终,如果循环结束后仍然没有找到中位数的位置,代码会抛出一个错误,表示输入的数组不是有序的。
代码
function findMedianSortedArrays(nums1, nums2) {if (nums1.length > nums2.length) {return findMedianSortedArrays(nums2, nums1);}const x = nums1.length;const y = nums2.length;let low = 0;let high = x;while (low <= high) {const partitionX = (low + high) >> 1;const partitionY = ((x + y + 1) >> 1) - partitionX;const maxX = (partitionX === 0) ? Number.NEGATIVE_INFINITY : nums1[partitionX - 1];const maxY = (partitionY === 0) ? Number.NEGATIVE_INFINITY : nums2[partitionY - 1];const minX = (partitionX === x) ? Number.POSITIVE_INFINITY : nums1[partitionX];const minY = (partitionY === y) ? Number.POSITIVE_INFINITY : nums2[partitionY];if (maxX <= minY && maxY <= minX) {if ((x + y) % 2 === 0) {return (Math.max(maxX, maxY) + Math.min(minX, minY)) / 2;} else {return Math.max(maxX, maxY);}} else if (maxX > minY) {high = partitionX - 1;} else {low = partitionX + 1;}}throw new Error("Input arrays are not sorted.");
}
代码解析
((x + y + 1) >> 1) - partitionX这段代码是什么意思
((x + y + 1) >> 1) - partitionX 这段代码用于计算 partitionY,即将第二个数组 nums2 分成左右两部分的分界点。让我解释一下这个表达式的含义:
x是第一个数组nums1的长度。y是第二个数组nums2的长度。partitionX是将第一个数组nums1分成左右两部分的分界点。
现在来逐步解释这个表达式:
-
x + y + 1:首先,将两个数组的长度相加,并加1。这是因为在计算中位数时,需要考虑总的元素个数是否为奇数还是偶数。 -
>> 1:然后,对上述结果进行右移一位,相当于除以2。这是因为中位数是将数组分成两部分,左半部分和右半部分,因此需要将总长度分为两半。 -
- partitionX:最后,从上述结果中减去partitionX。partitionX表示将第一个数组nums1分成左右两部分的分界点。减去partitionX的目的是确定第二个数组nums2分成左右两部分的分界点partitionY。
这个表达式的目的是计算如何将两个数组分成左右两部分,以满足中位数的条件。它考虑了两个数组的长度,以确保正确计算中位数的位置。在这种二分查找算法中,partitionX 和 partitionY 的计算是关键,因为它们指导着如何在两个数组中查找中位数的位置。
if (maxX <= minY && maxY <= minX) {这段代码是什么意思
maxX表示第一个数组nums1中分界点partitionX左侧部分的最大值,或者在partitionX为0时为负无穷大。minY表示第二个数组nums2中分界点partitionY右侧部分的最小值,或者在partitionY为y时为正无穷大。maxY表示第二个数组nums2中分界点partitionY左侧部分的最大值,或者在partitionY为0时为负无穷大。minX表示第一个数组nums1中分界点partitionX右侧部分的最小值,或者在partitionX为x时为正无穷大。
这个条件 maxX <= minY && maxY <= minX 检查以下情况是否成立:
-
maxX小于等于minY:即第一个数组左侧部分的最大值小于等于第二个数组右侧部分的最小值。 -
maxY小于等于minX:即第二个数组左侧部分的最大值小于等于第一个数组右侧部分的最小值。
如果这两个条件都成立,意味着已找到中位数的位置,因为左侧部分的元素都小于或等于右侧部分的元素。这是中位数的定义。
在满足这些条件的情况下,根据总元素个数是奇数还是偶数,代码返回相应的中位数值。如果总元素个数是偶数,中位数是左右两部分的最大值和最小值的平均数;如果总元素个数是奇数,中位数是最大值中的较大值。
这个条件判断是整个算法中的核心,用于确定中位数的位置。如果条件不成立,代码将根据情况更新 low 或 high,以继续二分查找,直到找到中位数的位置
总结
希望本文会对你有所帮助,如果有任何疑问可以留言与我沟通。
相关文章:
LeetCode 力扣: 寻找两个正序数组的中位数 (Javascript)
LeetCode力扣双指针题目 主要提供了力扣热题第四题,使用js,复杂度O(log(mn)),寻找两个正序数组的中位数。 题目解析 题目要求在两个已排序数组 nums1 和 nums2 中找到它们的中位数。为了满足时间复杂度要求 O(log (mn)),可以采…...
第 4 部分 — 增强法学硕士的安全性:对越狱的严格数学检验
一、说明 越狱大型语言模型 (LLM)(例如 GPT-4)的概念代表了人工智能领域的一项艰巨挑战。这一过程需要对这些先进模型进行战略操纵,以超越其预先定义的道德准则或运营边界。在这篇博客中,我的目的是剖析数学的复杂性,并…...
Next.js 中的中间件
Next.js 中的中间件 Next.js 中的中间件是一个功能强大的工具,允许开发人员拦截、修改和控制应用程序中的请求和响应流。无论我们是构建服务器渲染的网站还是成熟的 Web 应用程序,了解如何有效使用中间件都可以显着增强项目进出的数据流。本文将从基础知…...
一、C#笔记
1.注释 /*多行注释*/class HelloWorld{ void Hello(){Console.WriteLine("Hello!");//单行注释}} 2.理解语句 2.1方法、语法、语义 2.2使用标识符 标识符语法规则: 只能使用字母(大写和小写)、数字和下划…...
井盖发生位移怎么办?智能井盖传感器效果
井盖位移是一种严重的安全隐患,因为它可能导致道路受阻并干扰正常的交通,还可能对行人和车辆的安全造成威胁。为了有效应对这一问题,智能井盖传感器的应用提供了一种解决方案。智能井盖传感器可以实时监测井盖的位移情况,并在发现…...
go-zero 开发之安装 goctl 及 go-zero 开发依赖
安装 goctl go 版本在 1.16 及以后执行: GO111MODULEon&&go install github.com/zeromicro/go-zero/tools/goctllatestgo 版本在 1.16 之前执行: GO111MODULEon&&go get -u github.com/zeromicro/go-zero/tools/goctllatest验证是否安…...
win11 CUDA(12.3) + cuDNN(12.x) 卸载
win11 CUDA(12.3) cuDNN(12.x)卸载 信息介绍卸载 信息介绍 本文是对应 win11RTX4070Ti 安装 CUDA cuDNN(图文教程) 的卸载 卸载 控制面板 --> 程序 --> 卸载程序 卸载掉图中红框内的,…...
037.Python面向对象_关于抽象类和抽象方法
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...
华为OD机试真题-5G网络建设-2023年OD统一考试(C卷)
题目描述: 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相连,请你设计算法,计算出能联通这些基站的最小成本…...
【Spring教程25】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例总结与SpringMVC工作流程分析
目录 1.入门案例总结2. 入门案例工作流程分析2.1 启动服务器初始化过程2.2 单次请求过程 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Mave…...
设计模式再探——装饰模式
目录 一、背景介绍二、思路&方案三、过程1.装饰模式简介2.装饰模式的类图3.装饰模式代码4.装饰模式,职责父类拆分的奥义5.装饰模式,部件抽象类的无中生有 四、总结五、升华 一、背景介绍 最近公司在做架构模型的时候,涉及到装饰模式的研…...
【Python必做100题】之第一题(求两数相加)
思路:键盘输入两个数字,求出两个数的和并打印 代码如下: num1 int(input("请输入一个数字:")) num2 int(input("再输入一个数字:")) #求两数相加 result num1 num2 print(f"两数相加的…...
java面试-Dubbo和zookeeper运行原理
远离八股文,面试大白话,通俗且易懂 看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。 java面试题汇总-目录-持续更新中 分布式注册中心和服务调…...
Rsync+Sersync
服务器相关参数 源服务器 192.168.17.101 目标服务器(同步到的服务器) 192.168.17.103 ##目标服务器配置 ###1、配置rsync服务 1、安装rsync yum -y install rsync 2、配置rsync vim /etc/rsyncd.conf 配置文件内容 uid root gid root use c…...
Leetcode刷题笔记题解(C++):25. K 个一组翻转链表
思路:利用栈的特性,K个节点压入栈中依次弹出组成新的链表,不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …...
从线性回归到神经网络
目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…...
LANDSAT_7/02/T1/RAW的Landsat7_C2_RAW类数据集
Landsat7_C2_RAW是指Landsat 7卫星的数据集,采用的是Collection 2级别的数据处理方法,对应的是Tier 1级别的原始数据(RAW)。该数据集包括了Landsat 7卫星从1999年4月15日开始的所有数据,共涵盖了全球范围内的陆地和海洋…...
绕过360给目标机器添加账户
CS BOF是什么? Beacon 对象文件 (BOF) 是一个已编译的 C 程序,按照约定编写,允许其在 Beacon 进程内执行并使用内部 Beacon API。BOF 是一种通过新的利用后功能快速扩展 Beacon 代理的方法。 BOF 的占地面积较小。它们在 Beacon 进程内部运…...
C/C++ 题目:给定字符串s1和s2,判断s1是否是s2的子序列
判断子序列一个字符串是否是另一个字符串的子序列 解释:字符串的一个子序列是原始字符串删除一些(也可以不删除)字符,不改变剩余字符相对位置形成的新字符串。 如,"ace"是"abcde"的一个子序…...
Nginx的stream配置
一、stream模块概要。 stream模块一般用于tcp/UDP数据流的代理和负载均衡,可以通过stream模块代理转发TCP消息。 ngx_stream_core_module模块由1.9.0版提供。 默认情况下,没有构建此模块。 -必须使用-with stream配置参数启用。 也就是说,必…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
