leetcode 4. Median of Two Sorted Arrays(二分查找)

图解LeetCode4:Median of Two Sorted Arrays 文章目录理解题意思路1:最直观解法思路2:二分查找代码实现结论 Leetcode算法系列将详细讲解一些经典的面试算法题。 今天的算法是LeetCode中第四个题目,Median of Two Sorted Arrays,也就是给定两个有序数组求出中位数。   理解题意 首先给定的是两个有序数组,比如{1,3}以及{2},那么合并这两个数组就是{1,2,3},因此很显然中位数是2; 再给定... 阅读详情

题目描述:

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

思路:

1.新建一个长度为m+n的数组,遍历两个数组,利用归并的方法将它们排好序放到新数组中,并返回对应新数组的中位数。

时间复杂度o(m+n),空间复杂度o(m+n).

2.题目中要求时间复杂度为o(logn),首先想到二分查找。

本题也可以参考数据流中的中位数https://blog.youkuaiyun.com/orangefly0214/article/details/87926398,如果我们能够将从一个数组中获得左边最大,右边最小,则很容易求得中位数。

注:将m个元素分割,会有m+1个分割点,idx分别为0-m,数组分割的情况:

若我们的数组为A,B两个数组,对它们进行如下构造:

(1)将数组A从第i个元素处分割,因为A有m个元素,所以会有m+1个分割点,它们的id记为0-m

(2)将数组B从第j个元素处进行分割,B有n个元素,所以会有n+1个分隔点,id记为0-n

(3)将A,B放到一起,左边在一个集合,右边在同一个集合,分别用left_part和right_part表示:

假设:左右两边长度相等,且左边最大值小于右边最小值。

1) len(left_part) == len(right_part)
2) max(left_part) <= min(right_part)

这样的话我们就将数组集合分成了两部分,且左边最大值小于右边最小值,此时我们就可以获得中位数:

median = (max(left_part) + min(right_part))/2.

根据上图,两个数组我们分别以i,j为分割点,且左右两边相等,则很容易得到:

①i+j=m-i+n-j(或者i+j=m-i+n-j+1)

假定n>m,那么i的变化范围就是0-m,由上面等式得j=(m+n+1)/2-i

②同时我们要保证

B[j-1] <= A[i] and A[i-1] <= B[j]

 

实现:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m=nums1.length;
        int n=nums2.length;
        if(m>n){
            return findMedianSortedArrays(nums2,nums1);
        }
        int start1=0;//start1和end1表示切割线的起止点,m个元素会有m条切割线
        int end1=m;
        int c=(m+n+1)/2;
        while(start1<=end1){
            int split1=(start1+end1)/2;
            int split2=c-split1;
            if(split1<m&&nums2[split2-1]>nums1[split1]){
                start1=split1+1;//split1太小,需要右移
            }else if(split1>0&&nums1[split1-1]>nums2[split2]){
                end1=split1-1;//split1太大,需要左移
            }else{
                int mLeft=0;
                int mRight=0;
                //分割点刚好合适
                if(split1==0){
                    mLeft=nums2[split2-1];
                }else if(split2==0){
                    mLeft=nums1[split1-1];
                }else{
                    mLeft=Math.max(nums1[split1-1],nums2[split2-1]);
                }
                if((m+n)%2==1){
                    return mLeft;
                }
                if(split1==m){
                    mRight=nums2[split2];
                }else if(split2==n){
                    mRight=nums1[split1];
                }else{
                    mRight=Math.min(nums1[split1],nums2[split2]);
                }
                return (mLeft+mRight)/2.0;
            }
        }
        
        return 0.0;
    }
}

 

 

参考:

https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2481/Share-my-O(log(min(mn)))-solution-with-explanation

https://windliang.cc/2018/07/18/leetCode-4-Median-of-Two-Sorted-Arrays/

9、 量子支持向量机:从经典到量子的跨越 本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。 阅读详情

相关推荐

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1759

LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

文章目录1. 题目2. 解题2.1 合并数组2.2 优化2.1解法,双指针2.3 二分法(找第k个数)2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))O(log(m + n))O(log(m+n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: ...

Michael是个半路程序员 1933

浙江大学Fast-Lab从0制作自主空中机器人公开课教程补充及部分注意事项(适用于ubuntu系统和ROS零基础)

浙江大学Fast-Lab从0制作自主空中机器人公开课纯萌新补充(适用于从没接触过ubuntu系统),记录了一些自己不会的地方以及踩过的坑

qq_39986834的博客 2985

二分查找那点事

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky… 这句话可以这样理解:思路很简单,细节是魔鬼。 本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。 而且

fkuner的博客 963

【STM32】从零构建串口IAP框架:BootLoader与App双向跳转实战解析

本文详细解析了STM32串口IAP框架的构建,重点阐述了BootLoader与App双向跳转的实战原理与实现步骤。内容涵盖Flash分区规划、中断向量表重定向、通信协议设计及固件升级流程,并针对跳转失败、程序跑飞等常见问题提供了解决方案,帮助开发者掌握产品级远程升级的核心技术。

wind6的博客 838

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 432

LeetCode 4. Median of Two Sorted Arrays Hard(二分查找)

题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ 问题描述 4. Median of Two Sorted Arrays Hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...

da_kao_la的博客 253

Cluster Computing期刊投稿实战:从格式调整到技术检查的全流程解析

本文详细解析了向Cluster Computing期刊投稿的全流程,涵盖心理准备、格式调整、参考文献处理及投稿系统操作。重点介绍了如何利用Springer LaTeX模板,特别是使用picins宏包解决作者简介排版难题,并强调了将BibTeX转换为BBL文件以避免技术审查陷阱,为研究者提供了一份实用的投稿指南。

weixin_28432777的博客 668

leetcode 4:寻找两个有序数组的中位数(二分法)

题目大意 给定两个大小为 m 和 n 的有序数组 nums1和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 ...

leoma2012的博客 772

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5984

Label Studio 数据标注平台,大模型预训练与微调必备

摘要:LabelStudio是一款开源数据标注工具,支持文本、图像等多种数据类型的标注。本文介绍了其安装方法(通过conda创建环境并pip安装)、基础使用流程(创建项目、导入数据、设置标签、标注导出)以及AI自动标注功能的实现。重点讲解了如何通过MLBackend集成LangChain模型实现自动标注:创建自定义模型类、构建预测链、处理返回结果,最后配置到LabelStudio项目中。该功能可显著提升标注效率,标注人员只需在AI预测结果基础上进行修正。

技术引领业务创新 290

leetcode刷题——算法(4):二分查找

二分查找 寻找一个数(基本的二分搜索) 因为我们初始化 right = nums.length - 1 所以决定了我们的「搜索区间」是 [left, right] 所以决定了 while (left <= right),同时也决定了 left = mid+1 和 right = mid-1 因为我们只需找到一个 target 的索引即可,...

qq_37772475的博客 327

安全监控:人员行为分析_(2).人员行为分析基础理论

人员行为分析是指利用计算机视觉技术对视频中的人类行为进行实时或离线检测、识别和理解的过程。视频采集:通过摄像头等设备获取视频数据。视频预处理:对视频数据进行噪声过滤、图像增强等处理,以便后续分析。特征提取:从视频中提取出与人员行为相关的特征,如人体姿势、动作轨迹等。行为识别:利用机器学习或深度学习模型对提取的特征进行分类,识别出具体的人员行为。行为理解:对识别出的行为进行进一步分析,理解其背后的意图或状态。在人员行为分析中,常用的公开数据集包括UCF101、HMDB51、ActivityNet等。

zhubeibei168的博客 1345

[LeetCode 4]Median of Two Sorted Arrays 二分查找

二分查找求解两有序数组合并后的中位数

zlasd的博客 510

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

leetcode |4. Median of Two Sorted Arrays(分治/二分查找)

解法1 排序 假排序,只排到前一半的数即可。 时间复杂度:O(m + n) public double findMedianSortedArrays(int[] nums1, int[] nums2) { int l1 = nums1.length; int l2 = nums2.length; int total = l1 + l2; ...

mike_learns_to_rock的博客 184

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 4. Median of Two Sorted Arrays - 二分查找(Binary Search)系列题11

题目关键字有序数组以及时间复杂度O(log(m+n)),提醒我们应该用二分查找法。这题的难点是该如何用二分查找法。题目要求的是从两个有序数组中找出它们的中位数。所谓中位数就是一个有序数组中最中间的那个(总数为奇数)或那两个数(总数为偶数)。这题最简单的方法是把两个有序数组合并成一个有序数组然后就立即知道中位数了,但时间复杂度满足不了题目要求。因此还是得用二分查找法。

hgq522的博客 392

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LeetCode4.Median of Two Sorted Arrays二分查找法

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). Subscribe to see whic

代码菌的blog 688

Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)

貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的。。。 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数。 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第几,然后和k做比较,最后以这个比较为依据接着二分直到求出第k个数。 本来这是两重二分,由于楼主的懒已经没有办法治疗了,用库函数upper_bound()代替了第二重二分,有志者可以自己...

anzhuzeng4278的博客 117

leetcode 4. Median of Two Sorted Arrays 归并排序+第K小数+二分查找

There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).Example 1: nums1 = [1, 3] num

JackZhangNJU的专栏 448

【算法入门】LeetCode 4. 寻找两个正序数组的中位数(Median of Two Sorted Arrays)详细解题指南|二分查找详解(Java & JavaScript)|算法详解与代码实

给定两个升序数列nums1和nums2,求这两个数组合并后的中位数。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000时间复杂度:O(log(m + n))数组可能为空,但至少有一个元素(m + n >= 1)寻找两个正序数组的中位数是一个经典的算法题,适合用来练习二分查找的应用。

南北极之间 1686

LeetCode 4. Median of Two Sorted Arrays 题解

本题是二分查找的经典问题,主要考察对二分查找算法的理解和应用。通过将问题转化为在两个有序数组中找到第 k 小的元素,我们可以使用二分查找来高效地解决这个问题。二分查找的核心思想是:使用两个指针分别指向查找区间的两端,计算中间位置,比较中间元素与目标值的大小,根据比较结果缩小查找区间,直到找到目标值或确定目标值不存在。这种方法的时间复杂度为 O(log(min(m, n))),适用于大规模有序数组的中位数查找。掌握二分查找的原理,对于理解搜索算法和算法设计思想非常重要。

cannonjinx的博客 1009

Leetcode 4 Median of Two Sorted Arrays

今天发现了leetcode上面一道题,觉得非常经典,记录之。 题目是这样的:给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素。另外一种更加具体的形式是,找到所有元素的中位数。本篇文章我们只讨论更加一般性的问题:如何找到两个数组中第k大的元素?不过,测试是用的两个数组的中位数的题目,Leetcode第4题 Median of Two Sorted Arrays 方案1:假

思维决定一切 3万+

Leetcode 4 median-of-two-sorted-arrays题解

Leetcode median-of-two-sorted-arrays题解 虽然很简单,但是值得纪念一下,第一次超过100%的人 题目链接 思路: **Talking is no use, show your my codes** 代码: class Solution { public double findMedianSortedArrays(int[] nums1, int[] n...

qq_42308861的博客 319

Median of Two Sorted Arrays

题目:leetcode Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity sh

bupt8846的专栏 808

LeetCode 4. Median of Two Sorted Arrays题解

题目 4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m...

孑辞的博客 412

leetcode之Median of Two Sorted Arrays问题

问题描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目示例: Example 1:

漫漫学习路 2949
上一篇: leetcode 124. Binary Tree Maximum Path Sum(递归)
下一篇: 拼多多-笔试题(拓补排序)
暴躁的猴子
博客等级 码龄10年 230粉丝 273原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值