在两个有序数组中找整体第k小的数

news2024/11/17 23:28:28

一、题目

给定两个已经排序的数组(假设按照升序排列),然后找出第K小的数。比如数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110}, 第 3 小的数是 8.。要求时间复杂度O(logN),空间复杂度O(1)。

二、解法

2.1、双指针

  • 用两个指针papb分别指向arr1arr2
    • 在初始状态,两个指针分别指向第一个起始值,即pa = 0, pb = 0。
    • 然后,我们开始进行比较,如果A数组的值比B数组的值小, 把A数组的指针pa向前移动,然后再进行比较。
    • 每次移动,我们都能够得到当前第 i 小的值(随着pa,pb 的移动,i 会逐渐变大)。
  • 比如对于数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110}
    • 初始时,pa = 0; pb = 0,因为(A[pa] = 1) < (B[pb] = 5), 所以,第 1 小的值为 1
    • 这个时候,我们会把 pa 向右移动,即 pa = 1, 并且 pb 保持不变: pb = 0.
    • 然后再次比较A[pa] 和 B[pb] 的值,因为 (A[pa] = 8) > (B[pb] = 5), 所以,第 2 小的值是 5, 然后,我们增加 pb 的值。
    • 请注意,如果我们用一个变量来保存当前第 i 小的值 (随着pa, pb的移动,i 的值也会增加,那个变量保存的值也会改变)。那么,当pa + pb = k 的时候,那么那个变量保存的一定是第 k 小的值
  • 这里要注意的是,当一个数组的指针已经“到头”了,这个时候怎么进行越界处理呢?我们这里可以用一个简单的判断语句就可以处理了。

2.2、二分查找

Pa+Pb+1=k;

Pa+Pb=k-1;

A[Pa-1]<B[Pb]&&B[Pb]<A[Pa];

B[Pb-1]<A[Pa]&&A[Pa]<B[Pb];

  • 通过上面这段代码,我们实际上是把数组延长了,每个数组多了两个值Integer.MIN_VALUE,Integer.MAX_VALUE

    • 这样,当pa = 0 是,我们也可以得到A[pa - 1] 的值:Ai_1 = ((pa == 0) ? Integer.MIN_VALUE : A[pa-1]);
    • 当 pa =A.length 时,我们可以得到 A[pa]的值:Ai =(pa == A.length) ? Integer.MAX_VALUE : A[pa]。
  • 这样,我们就不用担心越界的问题了。

有了上面的分析,代码就容易写出来了。

  • 在程序里,我们设置 pa 的初始值为Math.min(A.length, k - 1)
  • 然后,通过增加或者减少pa 的值,来使得 B[pb] < A[pa] && B[pb] > A[pa - 1] 或者A[pa] < B[pb] && A[pa] > B[pb - 1] 成立
  • 代码中, delta 指的是 pa 的变化量,每次递归以后,delta的值变成一半。

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

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

相关文章

基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务

写在前面 工作原因&#xff0c;顺便整理博文内容为一个 人脸检测服务分享以打包 Docker 镜像&#xff0c;可以直接使用服务目前支持 http 方式该检测器主要适用低质量人脸图片处理理解不足小伙伴帮忙指正&#xff0c;多交流&#xff0c;相互学习 对每个人而言&#xff0c;真正的…

11.动名词

一.什么是动名词 动名词是动词的另一种非谓语动词形式。动名词跟宾语或状语构成动名词短语&#xff0c;动名词跟动词不定式一样&#xff0c;都属于非谓语动词&#xff0c;不能作谓语&#xff0c;动名词或动名词短语可以作主语&#xff0c;表语&#xff0c;宾语&#xff0c;介词…

fastjson2与fury的巅峰对决,谁会笑到最后?

写在前面 两个月前&#xff0c;我们写过一篇关于fury和protostuff的性能对比的文章&#xff1a;谁才是真正的协议之王&#xff1f;fastjson2 vs fury&#xff0c;那时&#xff0c;两个协议框架各有千秋&#xff0c;不分伯仲&#xff0c;今天&#xff0c;看到fury推出了全新的0…

我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)

文章目录 前言一丶超级玛丽二、沙漠打地鼠三、贪吃蛇四、坦克大战五、五子棋 前言 获取python整套完整教程&#xff0c;3263学习笔记&#xff0c;源码&#xff0c;项目实战&#xff0c;全部在手&#xff0c;python不愁~~~ Python学习资料点击领取福利 例如&#xff1a; 超级…

js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

1.函数的柯里化 自定义函数的柯里化 // 自定义函数的柯里化function curry(fn) {//判断输入的函数有几个参数let len fn.length;// 返回一个函数,并且有函数名为treturn function t() {// 获取到实参的个数let innerLength arguments.length// 获取到真实参数,转化为数组[.…

FPGA---UDP通信求助

项目场景&#xff1a; 使用UDP进行回环&#xff0c;网络调试助手&#xff0c;发送数据通过UDP接收模块接收&#xff0c;解析出数据&#xff0c;给到UDP发送模块&#xff0c;传回上位机。 问题描述 UDP接收模块中&#xff0c;接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

javapoet 注释中添加枚举值

问题描述 使用javapoet生成源代码 为了实现这么一个目的 解决 翻了一下源代码&#xff0c;他的实现如下&#xff1a; 这个方法是私有的&#xff0c;暂时不确定如何调用 照着这个方法&#xff0c;即可实现大多数类型的基本调用 即可实现上图需要的效果

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

[华为认证]路由表和FIB表

路由器转发数据包的关键是路由表和FIB表&#xff0c;每个路由器都至少保存着一张路由表和一张FIB&#xff08;Forwarding Information Base&#xff09;表。路由器通过路由表选择路由&#xff0c;通过FIB表指导报文进行转发。 路由表 每台路由器中都保存着一张本地核心路由表&…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础&#xff0c;是一个重点和难点&#xff0c;在实际编程中似乎看不它们的身影&#xff0c;但是它们有随处不在&#xff0c;如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记&#xff0c;合集文章列表如下&#…

delphi socket cross开源跨平台通讯库

delphi socket cross是Pascal开源跨平台的tcp通讯组件 windows下用的iocp linux下用的epoll 支持http&#xff0c;https 开源地址&#xff1a;GitHub - winddriver/Delphi-Cross-Socket: Delphi cross platform socket library 下图来自网络&#xff1a;

陪诊系统|陪诊系统解放繁琐,为陪诊添便利

在当代快节奏的生活中&#xff0c;随着医疗服务的不断发展&#xff0c;陪诊成为了越来越多人的需求。然而&#xff0c;传统的陪诊方式却存在着时间成本高、沟通不畅、服务体验差等问题。但近年来&#xff0c;陪诊小程序的兴起却为这一难题提供了创新的解决方案。 陪诊小程序&a…

Congestion Control for Large-Scale RDMA Deployments

文章目录 IntroductionDCQCNBuffer Setting Introduction PFC是粗粒度的流量控制机制&#xff0c;在端口层面发挥作用&#xff0c;不区别不同的流。这会导致很多弊端&#xff0c;比如不公平&#xff0c;受害流等。 解决PFC限制的解决方法是flow-level的拥塞控制&#xff0c;D…

拥抱AI变革,实现企业数字化重生!

在当今这个数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐成为企业转型的核心驱动力。本文将探讨AI如何在企业数字化转型中发挥重要作用&#xff0c;以及应对数字化转型中可能出现的风险和挑战。 目前&#xff0c;企业数字化转型的趋势日益明显…

如何更改照片底色(免费)

一、小程序截图 ①微信上找证件照的小程序&#xff0c;比如“独九证件照” ②换底色然后上传照片&#xff1a; ③ 原图&#xff1a; 换底色后的图&#xff1a; ④截图&#xff1a; ⑤裁剪 然后就得到免费的换底片后的证件照了。 二、PS修改 方法一&#xff08;更建议用&…

VueRouter与expres/koa中间件的关联

ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数)&#xff0c;只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…

408-2014

一、单项选择题 1.下列程序段的时间复杂度是_______。 count0; for(k1;k<n;kk*2)for(j1;j<n;j)count; A.O() B.O(n) C.O() D.O(n*n) 解答&#xff1a;C 外层循环的时间复杂度为 O() &#xff0c;内层循环的时间复杂度为 O(n)&#xff0c;因此结果…

Matlab图像处理——基于机器视觉的苹果中心花及边花识别

一、简介 基于机器视觉技术&#xff0c;实现苹果中心花及边花识别&#xff0c;并将程序集合为GUI界面&#xff0c;在界面上完成相应的操作。实现了对图像进行预处理&#xff0c;分割出花心和边花&#xff0c;然后统计边花的数量。并且可以根据自己的需求和图像的特性来调整阈值…

idea中使用git【图文详解】

配置 配置Git 设置——Version Control——Git——Path to Git executab【D:\Git\Git\bin\git.exe】 创建Git查看 最上面VCS——Create Git Repository 添加忽略项 安装ignore插件&#xff1a;设置——plugins——搜索ignore 新建ignore文件&#xff1a;右击项目——new——.…