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; 再给定... 阅读详情

现给两个已排序的数组nums1和nums2,长度分别为m和n

求两个数组合并后的中位数,要求复杂度为O( log( m+n ) )


  • 例1:
nums1 = [1, 3] 
nums2 = [2]

The median is 2.0
  • 例2:
 nums1 = [1, 2]
 nums2 = [3, 4]

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

虽然二分的复杂度是O( log(n) ),但合并的复杂度是O( n ),只能找trick咯…


题解

原文链接

为了解决这个问题,首先要理解中位数有什么用
在统计学中,中位数用于:“把一个集合分成两个长度相等的子集,其中一个子集的任何一个元素总是大于另一个子集的任何元素(即一个子集中最小的元素大于另一个子集中最大的元素)”
理解了这个,我们就非常接近问题的答案了。


设集合A、B长度分别为m、n
取随机数i满足0<=i<=m , j满足0<=j<=n

首先我们在i位置把A分成左右两部分:

      left_A             |        right_A
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]

因为A有m个元素,所以有m+1种分法 (i = 0 ~ m)
同时我们知道:len(left_A) = i, len(right_A) = m - i

同样,我们在j位置把B分成左右两部分:

      left_B             |        right_B
B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

我们把left_A和left_B放在一起称为left_part,同样把right_A和right_B放在一起称为right_part:

      left_part          |        right_part
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]
B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

只要我们保证下面两个条件,集合A、B合并之后得到的集合{A, B}就被分成了两个子集left_part和right_part
中位数为 ( max(left_part) + min(right_part) )/2

1) len(left_part) == len(right_part)//长度相等
2) max(left_part) <= min(right_part)//大小关系

1)
len( left_part ) == i + j
len( right_part) == m - i + n - j(或 m-i+n-j+1)
2)
A[i-1] <= A[i] 、B[j-1] <= B[j]
B[j-1] <= A[i] 、A[i-1] <= B[j]

为了满足这两个条件,只需要保证:

(1) i + j == m - i + n - j //m+n为偶数
    i + j == m - i + n - j + 1//m+n为奇数,右边+1就把中位数放在了left_part

(2) B[j-1] <= A[i] and A[i-1] <= B[j]
//因为序列已排序,A[i-1] <= A[i] and B[j-1] <= B[j]已成立

注解:
1、暂时只考虑通常情况,边界情况我们之后再讨论
2、为了方便起见,我们保证n >= m,这样就有:i = 0~m ,j = (m + n + 1)/2 - i //否则j可能为负

所以:
在保证n >= m的情况下,我们使i = 0~m , 则j = (m + n + 1)/2 - i ,此时i、j满足条件(1)。
在此前提下我们只需要找到合适的i,使得B[j-1] <= A[i] 、 A[i-1] <= B[j]即可。

下面给出使用二分法搜索i的伪代码:

<1> imin = 0, imax = m 我们在[imin , imax]区间进行搜索
<2> i = (imin + imax)/2, j = (m + n + 1)/2 - i
<3> 此时i、j满足条件(1),而且我们只会遇到以下三种情况:

  • a) B[j-1] <= A[i] and A[i-1] <= B[j]
    • 条件(2)满足,我们找到了合适的i
  • b) B[j-1] > A[i]
    • 此时A[i]较小,需要增大A[i]
    • 由于序列已排序,A[i]与i正相关,所以我们调整搜索区间为[i+1, imax]
    • goto<2>
  • c) A[i-1] > B[j]
    • 同理,我们调整搜索区间为[imin, i-1]
    • goto<2>

注解:
B[j-1] > A[i]和A[i-1] > B[j]不会同时满足,因为A[i] > A[i-1]、B[j] > B[j-1]

此时我们已经找到了合适的i,所以中位数为:
max(A[i-1], B[j-1])//m+n为奇数,设置j的值时我们把它放在了left_part
(max(A[i-1], B[j-1]) + min(A[i], B[j]))/2 //m+n为偶数,由于(m + n + 1)/2 == (m+n)/2


好了,是时候讨论边界情况了:
当取 i=0,i=m,j=0,j=n 时 A[i-1],B[j-1],A[i],B[j]可能不存在

事实上边界情况比想象中的容易处理:

当i、j的取值满足条件(1)时,我们还要做的是保证max(left_part) <= min(right_part)
所以:当i、j不是边界值的时候我们需要保证B[j-1] <= A[i] 和A[i-1] <= B[j];而当A[i-1],B[j-1],A[i],B[j]中的某个不存在时,我们只要不考虑它就可以了。例如i=0时A[i-1]不存在,我们不考虑A[i-1] <= B[j],只要B[j-1] <= A[i]就保证了max(left_part) <= min(right_part)

由此,我们将合适的i的条件修改为:
(j == 0 or i == m or B[j-1] <= A[i]) and (i == 0 or j == n or A[i-1] <= B[j])


最后,给出代码:

 def median(A, B):
    m, n = len(A), len(B)
    if m > n:
        A, B, m, n = B, A, n, m
    if n == 0:
        raise ValueError

    imin, imax, half_len = 0, m, (m + n + 1) / 2
    while imin <= imax:
        i = (imin + imax) / 2
        j = half_len - i
        if i < m and B[j-1] > A[i]:
            # i is too small, must increase it
            imin = i + 1
        elif i > 0 and A[i-1] > B[j]:
            # i is too big, must decrease it
            imax = i - 1
        else:
            # i is perfect

            if i == 0: max_of_left = B[j-1]
            elif j == 0: max_of_left = A[i-1]
            else: max_of_left = max(A[i-1], B[j-1])

            if (m + n) % 2 == 1:
                return max_of_left

            if i == m: min_of_right = B[j]
            elif j == n: min_of_right = A[i]
            else: min_of_right = min(A[i], B[j])

            return (max_of_left + min_of_right) / 2.0

完结撒花~

从零开始:IBM V3700控制器更换与机器代码升级全流程指南 本文详细介绍了IBM V3700存储系统控制器更换与机器代码升级的全流程指南。从前期准备、硬件更换到版本同步,逐步解析如何应对503错误等常见问题,确保系统稳定运行。通过实战案例和优化建议,帮助工程师高效完成维护任务,提升存储系统可用性。 阅读详情

相关推荐

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1058

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的博客 318

Veeam Backup 13 通过UI界面高效备份VMware ESXi虚拟机的完整指南

本文提供了一份使用Veeam Backup 13图形化界面高效备份VMware ESXi虚拟机的完整指南。内容涵盖从环境准备、添加vCenter/ESXi主机、配置备份存储库,到创建备份任务、设置保留策略与计划,以及执行备份和验证成功的关键步骤。通过直观的UI操作,管理员可以轻松实现虚拟机数据的可靠保护与快速恢复。

weixin_29322553的博客 433

LC:4. Median of Two Sorted Arrays

4.Median of Two Sorted Arrays from typing import List class Solution: def findMedianSortedArrays(self, A: List[int], B: List[int]) -> float: m, n = len(A), len(B) if m &...

weixin_34221276的博客 184

工业4.0 底层逻辑

工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。

姚家湾博客 1993

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

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...

孑辞的博客 411

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文全面解析了青龙人形机器人硬件平台的设计与实现,涵盖构型设计、驱动系统、能源方案及控制系统等核心模块。重点介绍了43个自由度的仿生学实践、关节模组的技术突破以及多模态感知融合等创新设计,为开发者提供了从理论到实战的完整指南。

embedding5hiker的博客 890

Median of Two Sorted Arrays - LeetCode

目录 题目链接 注意点 解法 小结 题目链接 Median of Two Sorted Arrays - LeetCode 注意点 要考虑数组长度不一致的情况 解法 解法一:将两个数组合并成一个有序数组,根据数组长度分奇偶情况求中位数。时间复杂度为O(m+n) c...

weixin_30924239的博客 136

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2604

CARLA仿真:自定义地图与AI车辆行为编程

CARLA仿真:自定义地图与AI车辆行为编程 ,人工智能,计算机视觉,大模型,AI,本文围绕CARLA仿真平台,介绍了其基础功能与安装方法,详解地图系统,包括预设地图的加载切换及自定义地图的创建、导入与优化。还阐述了AI车辆的创建、属性设置、销毁,以及行为控制,如交通规则遵守、路径规划、复杂行为编程和行为树应用。同时涉及传感器与车辆感知、交通场景构建、自定义地图与AI行为结合应用、高级应用,以及常见问题解决方案和学习资源,为CARLA仿真应用提供全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

Substring with Concatenation of All Words & Median of Two Sorted Arrays & Divide Two Integers

(1) Substring with Concatenation of All Words

文森的学术之路 509

人工智能在慢病管理中的具体应用全集:从技术落地到场景创新

这一成果的取得,得益于 AI 对居民血压数据的实时监测和分析,以及及时的干预措施。据统计,医疗支出下降了 18%,这主要是由于 AI 慢病管理系统实现了对慢病患者的早筛早诊早治,减少了并发症的发生,降低了医疗资源的浪费,从而减轻了患者和社会的医疗负担。医院信息系统(HIS)、电子病历(EMR)、区域卫生平台、可穿戴设备(如三诺血糖仪、华为手环)、第三方健康APP以及体检中心的数据往往采用不同的数据标准和格式(如HL7、FHIR、JSON、CSV等),且存储在相互隔离的系统中,形成典型的数据孤岛。

AllenLV的博客 2089

LeetCode每天刷day4:Median of Two Sorted Arrays

题目链接:Median of Two Sorted Arrays C++: class Solution { public: double findMedianSortedArrays(vector&lt;int&gt;&amp; nums1, vector&lt;int&gt;&amp; nums2) { int len1 = nums1.size(); ...

Jos's blogs 168

廖雪峰Python教程[完整版]

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Leetcode 4 Median of Two Sorted Arrays

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

思维决定一切 3万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LeetCode-4. Median of Two Sorted Arrays [C++][Java]

Given two sorted arraysnums1andnums2of sizemandnrespectively, returnthe medianof the two sorted arrays. The overall run time complexity should beO(log (m+n)).

贫道绝缘子的博客 257

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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 4. Median of Two Sorted Arrays 题解

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

cannonjinx的博客 1008

Leetcode平台上的Median of Two Sorted Arrays题目用Java快排实现

Leetcode平台上的Median of Two Sorted Arrays题目,大意就是找两个已排序数组的中位数。今天先用快排的方式实现一下,代码如下: There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overal

sophie2805的专栏 766

java median of two sorted arrays,Median of Two Sorted Arrays

①原题There are two sorted arrays A and B 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)).②乡村英语翻译一下给你两个排序数组,容量为m的数组A,容量为n的数组...

weixin_35112865的博客 221

LeetCode Median of Two Sorted Arrays

There are two sorted arrays A and B 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)).思路分析:这题容易想到O(m+n)的解法,就是先Merge两个数组,然后返

Coding for Dreams 1731
上一篇: async whilst使用注意
下一篇: Container With Most Water
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值