当前位置: 首页 > news >正文

算法学习——寻找两个正序数组中位数

寻找两个正序数组中位数

这题难度比较大,记一下详细的思路

由于灵神的解析里面写的数组名字是a和b,题目里面又是nums1和nums2,我下面写的名字两种都有写,知道是一样的就行。

首先明确中心思想:将两个数组内的元素均匀分组,第一组的最大值小于等于第二组最小值。下面是几个关键点:

  1. 如果元素总个数为奇数,我们把第一组多分一个,最后返回第一组的最大值;如果是偶数,平均分,返回第一组最大值和第二组最小值的平均数。

  2. 由于我们是不断去看num1数组的元素是否属于第一组,最开始的时候是假设nums1数组有0个元素在第一组中的。为了避免nums2数组的元素全部用上都凑不够第一组所需要的元素个数,最开始我们判断两个数组的长度,如果nums1比nums2长,就交换,保证nums1长度肯定小于Nums2。

  3. 对于二分法,其实就是找到nums1中满足ai<=bj+1的最大的元素位置,我们可以写成闭区间,left=0,right=m-1,区间内的元素是不知道是否满足ai<=bj+1的元素。right右边(不包含)是不满足的,left左边(不包含)是满足的。

  4. i之间赋值成二分的位置。注意j和i的关系:

  1. 和之前二分一样:如果满足条件,left=left+1;不满足right=right-1;

  2. 注意最后返回的位置:right会在left左边一位,我们这样想:right右边的全是不满足的,left左边的都是满足的,因此最大的满足的位置就在当前right的位置(这和之前结果是Left是相反的,但是原理都是一样的,学会用区间表示的意义判断即可,可以画个图)。

  3. 最后确定值的时候要注意两种特殊情况:

(1)nums1中元素全部不在第一组,这时候i=-1,我们的ai不能之间赋值,要赋值成负无穷:

其实这里还要注意,有可能bj正好是b数组的最后一个元素,那么bj+1也就是溢出了,这时候赋值成正无穷。

(2)nums1中的元素全部都在第一组,这时候i=m-1,ai+1是溢出的,要赋值成正无穷。

同样也要注意,这时候有可能a数组的元素与第一组的元素完全相等,b数组没有元素在第一组,j=-1,bj要赋值成负无穷。

  1. 这里再记一下为什么不用最开始讲的在数组前后补正负无穷的方法:因为插入的步骤使得时间复杂度增大,即使用了二分也不能简化成log(m+n)的复杂度,最后我们的复杂度其实是log(min(m,n))

http://www.jsqmd.com/news/48432/

相关文章:

  • 5、JDBC-常见问题
  • 语音频谱特征提取(python)
  • 深入解析:flink实验三:实时数据流处理(踩坑记录)
  • 触觉感知机器人如何规划与执行动作
  • 2025 年 11 月江苏省骨科医院权威推荐榜:专科诊疗、医保定点、工伤定点,专业骨科服务与高效医疗保障之选
  • 2025 年 11 月智能配电系统厂家权威推荐榜:配电柜/配电箱/开关柜源头工厂,高效节能与稳定安全技术深度解析
  • iptables下MySQL安全防护怎么做
  • iptables下MySQL安全设置有哪些
  • 2025 年 11 月防水公司权威推荐榜:商铺装修防水、别墅补漏防水、厂房防潮防水,专业施工与持久防护口碑之选
  • SHOW STATUS LIKE Aborted_connects; 这个连接是啥意思
  • 2025 年 11 月无锡公考/考编培训机构权威推荐榜:事业单位与央企国企招录培训实力解析及口碑优选指南
  • 人工智能之编程进阶 Python高级:第十一章 过渡项目
  • CF2122
  • 《d2l Chapter4 多层感知机基础内容》
  • 洛谷P2678题解
  • 【JVM】详解 Class类文件的结构 - 指南
  • 实验3_CPP
  • longchain4j 学习系列(4)-mcp调用
  • Java 学习路线可按「基础→进阶→实战→架构」四阶段推进
  • Jetson Orin Nano super -2 烧录概念及必要性
  • blog搬迁
  • 102302122许志安作业3
  • iPhone14系列电池容量多少毫安
  • ipc linux
  • 读 《d2l:Chapter3. 线性神经网络 》随笔
  • 错排的
  • ipad学linux
  • iPadOS16有什么新功能
  • ipad linux
  • 深入解析:蓝色星球如何打造能与企业共同进化的灵活系统