求两个有序数组的中位数

两个等长有序数组求中位数 在网上看了很多两个等长有序数组求中位数的文章,但我都觉得有点儿问题。等下会说我觉得问题在哪里。 先说下中位数定义:当数组元素个数为奇数个的时候,中位数就是中间的数字,比如数组[1,2,3,4,5],那么3就是中位数。如果数组元素个数为偶数个的时候,那么中间两个元素的平均值就是中位数的值,比如数组[1,2,4,5],那么中位数就是(2+4)/2=3. 定义清楚了下面就来说下两个等长数组求中位数的 阅读详情

题目:给定两个有序数组,都是按照从小到大排好序,求它们合并后的中位数。

 

分析:在数据结构中我们学过,合并两个有序数组为一个有序数组的最好方法是归并排序。当然这只是归并排序的一

个子操作,这样的时间复杂度为O(n)。实际上我们还有更好的方法,使时间复杂度缩短至。

 

 

这种快速的方法是这样的:

 

(1)先来看看这两个有序数组长度都相等的情况

    先来比较a[n/2]与b[n/2],如果它们相等,那么答案就找到了,a[n/2]就是排序后的中位数。如果我们发现

    a[n/2] > b[n/2],那么说明这个中位数在a[n/2]~a[n]或者b[0]~b[n/2]里面。这样我们这样就可以进

    行递归了。

 

int Find(int a[],int b[],int len)
{
    if(len == 1) return a[0];
    int t = len >> 1;
    if(a[t] == b[t])
        return a[t];
    if(a[t] < b[t])
        return Find(&a[t],&b[0],len-t);
    return Find(&a[0],&b[t],len-t);
}

 

(2)如果这两个有序数组的长度不一样呢?

    我们假定B数组比A数组长一点。A的长度为n, B的长度为m。比较A[n/2]和B[m/2] 时候。类似的,我们还

    是分成几种情况来讨论:

 

    a. 如果A[n/2] == B[m/2],那么很显然,我们的讨论结束了。A[n/2]就已经是中位数,这个和他们各自

      的长度是奇数或者偶数无关。

 

    b. 如果A[n/2] <  B[m/2],那么,我们可以知道这个中位数肯定不在[A[0],A[n/2])这个区间内,同时

      也不在[B[m/2],B[m]]这个区间里面。这个时候,我们不能冲动地把[A[0],A[n/2])和[B[m/2],B[m]]

      全部扔掉。我们只需要把[B[m-n/2],B[m]]和[A[0],A[n/2])扔掉就可以了,这样我们就把我们的问题

      成功转换成了如何在A[n/2]->A[n]这个长度为n/2的数组和B[1]-B[m-n/2]这个长度为m-n/2的数组里

      面找中位数了。问题复杂度即可下降了。

  

    c. 只剩下A[n/2] > B[m/2],和b类似的,我们可以把A[n/2]->A[n]这块以及B[1]->B[n/2]这块扔掉

      了就行,然后继续递归。

 

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 1005;

int a[N],b[N];

int Find(int a[],int La,int b[],int Lb)
{
    int x = La >> 1;
    int y = Lb >> 1;
    int t = x < y ? x : y;
    if(La == 1)
    {
        if(Lb & 1)
            return b[y];
        else
        {
            if(a[0] >= b[y])
                return b[y];
            if(a[0] <= b[y-1])
                return b[y-1];
            return a[0];
        }
    }
    if(Lb == 1)
    {
        if(La & 1)
            return a[x];
        else
        {
            if(b[0] >= a[x])
                return a[x];
            if(b[0] <= a[x-1])
                return a[x-1];
            return b[0];
        }
    }
    if(a[x] == b[y])
        return a[x];
    if(a[x] < b[y])
        return Find(a+t,La-t,b,Lb-t);
    return Find(a,La-t,b+t,Lb-t);
}

int main()
{
    int n,m;
    freopen("data.in","r",stdin);
    while(cin>>n>>m)
    {
        for(int i=0; i<n; i++)
            cin>>a[i];
        for(int i=0; i<m; i++)
            cin>>b[i];
        cout<<Find(a,n,b,m)<<endl;
    }
    return 0;
}

 

 

 

给出两个长度为N的有序数组A和B 给出求中位数的算法 有个同学阿里面试被问到“给出两个长度为N的有序数组A和B 给出求中位数的算法”  怎么办??很熟悉是吧 但是就是想不起来。。 题目是《算法导论》上的一道习题,不过已多次出现在面试题当中。注意,此题中两个数组的长度是相等的。当然,长度不等的话也可以做,只是要多些判断条件。参考leetcode题目 Median of Two Sorted Arrays 方法1 直接遍历 直接 阅读详情

相关推荐

算法题:两个有序数组求中位数

leetcode上遇到的一道题,感觉很有意思 因为要求O(log(m+n)),所以第一反应时用二分来找,但是该怎么用二分呢? 数组A,B分别有序,我们可以先找到数组A中的一条分界线i,使得数组A分为A_left,和A_right两部分,那么因为时要找到中位数,我们可以直接计算出B数组的一条分界线j,使得size(Aleft)+size(Bleft)=size(Aright)+size(Brigh...

牛逼! 9480

寻找两个有序数组的中位数(附上三种解法)

目录 •写在前面 •题目 •解法一 •解法二 •解法三 •结束 •写在前面 这道题比较经典,我当时在做的时候,想出了两种解决方案,不过总感觉算法不够优美,所以找到了另一种我觉得非常精妙的解法,利用了K最小数的思想去解决这道题,很值得讲一下,不知道K最小数的,可以参考我另一篇文章,点击这里跳转就可以了。下面我废话不多说,直接开始讲解。 •题目 首先先把题目呈上来,具体题目如下: ...

BoCong-Deng的博客 1万+

手把手调试Altera FPGA远程升级:从ASMI扇区擦除到Remote Update IP配置的避坑实录

本文详细解析了Altera FPGA远程升级的全流程,重点介绍了Cyclone IV系列FPGA的ASMI扇区擦除和Remote Update IP配置的实战技巧。通过双镜像架构设计、ASMI IP核优化配置及Remote Update IP的隐藏参数设置,帮助开发者避免常见陷阱,提升远程升级的可靠性和效率。

weixin_30872499的博客 447

寻找两个有序数组的中位数

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。问题描述给定两个大小为m和n的有序数组nums1和nums2,找出这两个有序数组的中位数。示例一:nums1=[...

算法与编程之美 5466

Oracle ERP EBS R12 GL总帐业务方案 系统操作

本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。

anpeng2019的博客 1885

基于Python实现基于遥感指数的水体提取

基于Python实现基于遥感指数的水体提取

gis收藏家的博客 6146

[每日一题] 121. 寻找两个有序数组的中位数(数组、二分法、马拉车算法、多方法)

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

Y-puyu 的博客 892

电芯外观及体系设计(Cell Design)-①容量平衡设计(Cell Balance Design)

全面获取并正确解读客户需求,将需求进行分解和预判,结合公司现有资源、技术,给出设计方案。一个优秀的电芯设计方案,应该是稳健的,可操作的,满足客户需求的同时,并能为公司带来较多利润。电芯设计需同时考虑周期,性能,品质,加工性,成本,及安全与稳健性。设计人员时刻要有成本控制观念,但利润则是由公司战略所决定。

FDC1303864002的博客 1351

求两个有序数组的中位数(等长)

阅读:https://blog.youkuaiyun.com/wzwdcld/article/details/81607625 https://blog.youkuaiyun.com/wzwdcld/article/details/81607625 1.        算法要求 一个长度为L(L≥1)的升序序列S,处在第L / 2(若为小数则...

qq_32534441的博客 3290

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1032

纳米尺度仿真软件:Quantum Espresso_(13).非线性光学性质计算

通过 Quantum Espresso,可以高效地计算材料的非线性光学性质,包括二阶和三阶非线性极化率。这些性质在许多现代技术中具有重要的应用价值。在准备输入文件时,需要详细描述系统的晶格结构和原子位置,选择合适的基组和赝势,并设置计算参数和微扰设置。通过优化计算参数和使用并行计算,可以提高计算效率和精度。最后,使用适当的工具进行结果分析和可视化,可以更好地理解材料的非线性光学行为。

kkchenjj的博客 1277

python怎么求中位数_Python求两个有序数组的中位数的几种方法

求两个有序数组的中位数的几种方法思路一:def median_1(A, B):# 思路一: 先组合成一个有序数列,再取中位数# 时间复杂度O(m+n)len_A = len(A)len_B = len(B)C = []if len_A == len_B == 0:raise ValueErrori = j = 0for k in range(0, len_A + len_B):if j == le...

weixin_39622283的博客 1034

2023华为od机试C卷【启动多任务排序】C++ 实现

一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。

MISAYAONE的博客 885

求中位数_求两个有序数组中所有数的中位数

描述:给定两个有序的数组,nums1, nums2 , 找出这两个数组中所有数字的中位数。例如: nums1 = [1, 3] nums2 = [2] 结果是 2nums1 = [1, 2] nums2 = [3, 4] 结果是 (2 + 3)/2 = 2.5解法1:这是最容易的想到的方法,直接将两个数组拼接,然后重新排序,并找出中间的数。/** * @param {number[]} nu...

weixin_39559079的博客 294

Unity Hololens2开发|(三)工程发布及真机部署(3种方法)

选择项目->属性,进入项目属性页,选择调试,将HoloLens2的IP地址填写至页面,如下图。确保HoloLens2与计算机在同一网络下,并保持开启状态,点击运行,即开始生成部署.注意:该方式不支持覆盖安装,如果重复安装同一个App,需要先卸载再安装!选择Release下的ARM64,选择远程计算机,如下图。

游戏开发小Y的博客 14万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[LeetCode] 求两个有序数组的中位数

[LeetCode] 求两个有序数组的中位数From: https://leetcode.com/problems/median-of-two-sorted-arrays/#/solutions 我的个人博客:http://riot-qiu.coding.me/2017/06/08/median-of-two-sorted-arrays问题描述There are two sorted array

前进的路上的专栏 1514

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

求中位数_每日一题04:寻找两个有序数组的中位数

问题描述:给定两个大小为 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 + 3)/2 = ...

weixin_35907189的博客 84

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Leecode求两个有序数组的中位数

Leecode求两个有序数组的中位数 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。 示例 1:nums1[1,3]nums2[2]中位数:2.0 示例 2:nums1[1,2]nums2[2,3]中位数:(2+2)/2=2.0 其中要求算法时间复杂度,也可以利用分治法来解决。 此时的...

weixin_44162311的博客 245

求两个等长有序数组的中位数

设两个有序数组的长度均为n,求它们组成的2n长的数组的中位数。 首先说明下中位数的定义: 统计学名词,当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。 中位数有个性质:在中位数两侧去掉任意数量的数后,中位数不变。 为了简化,先假设n为奇数,那么A[n/2]是中位数,假设 1. A[n/2]>B[n/2],那么A[

Walk More Slowly 1950

webjs求数组的中位数‘_每日一题04:寻找两个有序数组的中位数

问题描述:给定两个大小为 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 + 3)/2 = ...

weixin_39927214的博客 76
上一篇: 求两个单向无环链表的第一个公共交点
下一篇: 从海量数据中查找一个数
ACHelloWorld
博客等级 码龄14年 35粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值