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配置参数启用。 也就是说,必…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
