算法总结之 在两个长度相等的排序数组中找到上中位数

在两个长度相等的排序数组中找上中位数 题目描述 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n个数 [要求] 时间复杂度为O(logN)O(logN),额外空间复杂度为O(1)O(1) 示例1 输入 [1,2,3,4],[3,4,5,6] 返回值 3 说明 总共有8个数,上中位数是第4小的数,所以返回3。 示例2 输入 [0,1,2],[3,4,5] 返回值 2 说明 阅读详情

算法总结之 在两个长度相等的排序数组中找到上中位数

题目描述: arr1  和 arr2   长度都为N   求两个数组中所有数的上中位数

要求 时间复杂度 O(logN)  额外空间复杂度O(1)

 

这道题目的方法比较好玩:

   这两个数组如下表示:

 arr1[start1....end1]     arr2[start2...end2]

如果start1==start2  那么也有start2==end2   此时元素总个数是2个,上中位数为最小的那个  

如果start1!=start2  令mid1={start1+end1}/2      mid1={start2+end2}/2

     进而分情况

                             情况一、 如果arr1[mid1] == arr2[mid2]

                                                    如果两个数组长度为奇数或者偶数,那么arr1[mid1] == arr2[mid2]=上中位数

                             情况二、如果arr1[mid1] >arr2[mid2]

                                                   如果长度为奇数、(假设为5)arr1的第三个数>arr2的第三个数  此时上中位数只能是从arr1的{1,2,3}和arr2的{3,4,5}的共同的上中位数找 

                                                   如果长度为偶数,(假设为4)arr1的第二个数>arr2的第二个数  此时上中位数只能是从arr1的{1,2}和arr2的{3,4}的共同的上中位数找 

                                          如果arr1[mid1] <arr2[mid2]情况完全一致  请读者自行推理

 

代码实现是这样:

  特别类似于二分查找 哈哈  也是找mid 然后通过min去比较

     其实两个数组长度是一致的  某种程度上说是当前数组的影子 或者 映射吧 都是有关联的 所以重点操作一个数组 然后通过某种关系去映射另外一个数组就OK了

    比较两个数组mid的值 决定两个数组 后面遍历的走向

 

废话不多说,上代码:

package TT;

public class Test12 {

    public  static int getUpMedian(int[] arr1 , int[] arr2){
        
        if(arr1==null || arr2==null || arr1.length != arr2.length){
            throw new RuntimeException("hi,babay.are you ok?");
        }
        
        int start1 =0;
        int end1 = arr1.length-1;
        
        int start2=0;
        int end2 = arr2.length-1;
        
        int mid1 =0;
        int mid2 =0;
        
        int offset = 0;

        while(start1 < end1){
            mid1 = (start1+end1)/2;
            mid2 = (start2+end2)/2;
            //元素个数如果是奇数为0 偶数为1
            offset = ((end1 - start1+1)&1)^1;
            if(arr1[mid1] > arr2[mid2]){
                end1 = mid1;
                start2=mid2+offset;
            }else if(arr1[mid1]<arr2[mid2]){
                start1 = mid1 + offset;
                end2 = mid2;
            
            }else {
                return arr1[mid1];
            }            
        }
        
        return Math.min(arr1[start1], arr2[start2]);   
    }
    
    public static void main(String[] args){
        
           int[] a1 = new int[4];
           int[] a2 = new int[4];
           
          a1[0]=0;  a1[1]=1;  a1[2]=2; a1[3]=3;
          a2[0]=4;  a2[1]=5;  a2[2]=5; a2[3]=6;

          int c = getUpMedian(a1,a2);
          
          System.out.println(c);
        
        
    }
     
}

结果:

 

手写实现很多思路,我觉得这样写是最清晰明了的

public class Test4 {
    public static int getMidValue(int[] arr1, int[] arr2) {
        // 参数验证
        if (arr1 == null || arr2 == null || arr1.length != arr2.length) {
            throw new RuntimeException("请检查参数");
        }
        // 执行业务逻辑 (左右指针)
        int start1 = 0;
        int end1 = arr1.length - 1;

        int start2 = 0;
        int end2 = arr2.length - 1;

        while (start1 < end1) {
            int mid1 = (end1 - start1) / 2;
            int mid2 = (end2 - start2) / 2;
            // 移动的开关 (元素个数奇数偶数判断取决于 移动与否)
            int offset = (end1-start1+1)%2  == 0 ? 1 : 0;    //时刻判断
            if (arr1[mid1] > arr2[mid2]) {
                end1 = mid1;
                start2 = mid2 + offset;
            } else if (arr1[mid1] < arr2[mid2]) {
                end2 = mid2;
                start1 = mid1 + offset;
            } // 如果相等的话就直接返回了
            return Math.min(arr1[start1], arr2[start1]);

        }

        return Math.min(arr1[start1], arr2[start1]);
    }

    public static void main(String[] args) {
        int[] arr1 = { 1, 3, 5, 7 };
        int[] arr2 = { 2, 4, 6, 8 };
        int midValue = getMidValue(arr1, arr2);
        System.out.println(midValue);
    }
}

 

posted @ 2017-08-23 10:56 toov5 阅读( ...) 评论( ...) 编辑 收藏
别再手动算考勤了!教你用Python+企业微信API自动生成月度报表 本文介绍如何利用Python和企业微信API构建自动化考勤分析系统,实现从数据获取到可视化报表生成的全流程自动化。通过企业微信打卡接口获取数据,使用Pandas进行高效清洗和分析,并生成Excel和HTML格式的报表,大幅提升考勤统计效率。系统支持智能判定考勤状态,如迟到、早退等,并可通过定时任务实现月度自动化运行。 阅读详情

相关推荐

BSL编程语言 —— 系统化程序设计

BSL编程语言简介 文章目录0. 选择编程语言1. 写简单的表达式(Expression) 0. 选择编程语言 如果你第一次使用DrRacket,打开后需要选择Beginning Student Language (BSL) Language -> Choose Language (或直接按Ctrl + L),看到如下洁面后选择Beginning Student,点击OK 定义区【De...

CSDoneRight的博客 6451

在两个长度相等的排序数组中找到上中位数

在两个长度相等的排序数组中找到上中位数 题目描述 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n个数 [要求] 时间复杂度为O(logN)O(logN)O(logN),额外空间复杂度为O(1)O(1)O(1) 输入描述: 第一行一个整数N,表示数组大小。 接下来一行N个整数,表示arr1内的元素 再接下来一行N个整数,表示arr内的元素 输出描述: 输出一个整数表示答案 示例1

MIC10086的博客 911

对工时评估的思考:当AI颠覆了coding效率

在AI时代,“人日”作为软件工时度量衡已然失效。开发的价值核心正从“编码实现”转向“深度思考”与“精准沟通”——即如何将人类的模糊需求精确地传达给AI。当最有价值的“思想工作”变得最难量化时,传统的项目管理范式随之动摇。我们必须超越对过程的算计,开始探索衡量思想、沟通与业务价值的新标尺。

架构师刘7的博客 1017

NC36—在两个长度相等的排序数组中找到上中位数

题意 给定两个有序数组arr1和arr2,已知两个数组的长度都为 N,求两个数组中所有数的上中位数 上中位数:假设递增序列长度为 n,若 n 为奇数,则上中位数为第 n/2+1 个数,否则为第n/2个数 [要求] 时间复杂度为O(logN)O(logN)O(logN),额外空间复杂度为O(1)O(1)O(1) 题解 要求时间复杂度为O(logN)O(logN)O(logN),很容易想到二分查找,关键是怎么二分 如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都

fkuner的博客 357

同济土木非0基础三个月跨考复旦计算机攻略

跨考cs攻略前言我cs专业课如何复习How to start from zero简历其他复试 前言 建议多去工地/化工厂涡轮增压一下 我 同济土木gpa 3.2/5 挂科 * n 辣鸡项目 * n (padding 简历) 21考复旦计算机专硕 10月-12月 学习+复习 总分392 政治 68;背肖4即可 英语二 78 裸考,(高考英语140+);做点真题,建议据自己情况准备 数学二 142 ;(高考数学接近满分);做真题+模拟题,每天写一张试卷 专业课 104 ,考试生病了,下文展开。 cs专业课

piglake的博客 7238

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1856

Java算法(递归):在两个长度相等的排序数组中找中位数

public class ex_1 { public static void main(String[] args) { int[] arr1 = new int[]{1, 2, 3, 4}; int[] arr2 = new int[]{3, 4, 5, 6}; System.out.println(getUpMedian(arr1, arr2)); } public static int getUpMedian(int[] ar.

qq_37089829的博客 305

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 126

两个有序数组的中位数 【算法】

有两个有序数组A和B,设计算法求出A和B的中位数。 情况1. 数组A、B长度相等,设为n。 1)分别计算A和B的中位数m1和m2。 2)比较m1和m2。如果m1等于m2,那么最终结果就是m1(m2)。 3)如果m1大于m2,那么中位数必定在和两个子数组中。 4)如果m1小于m2,那么中位数必定在和两个子数组中。 5)重复上述步骤,直至两个子数组的大小均为2,那么最终结果为。

liushaobo的专栏 1805

stm32 Can通讯过滤器寄存器设置(实验验证)

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。 解决: 在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:type

u013984214的专栏 3289

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1546

程序基本算法习题解析 有两个长度相等的已排序数组,采用分治法求合并后的排序数组的中位数

书上举例说明了一下思路: 设数组长度为n。假设数组A的中位数为m1,数组B的中位数为m2,例如,arr1[]={1,12,15,26,38},arr2[]={2,13,17,30,45},则m1=15,m2=17。由于m1&lt;m2,可以确定中位数即为下面两个子数组中的中位数:[15,26,38]和[2,13,17]。重复这个步骤,可得m1=26,m2=13,由此得到两个子数组:[15,16]...

elma_tww的博客 668

Spring AI 项目实战(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司发票智能处理系统的技术实践(附完整源码)

本文介绍了基于百度OCR API与DeepSeek AI的发票智能处理系统,通过整合AI技术实现发票识别、信息提取和验证的全流程自动化。系统采用Spring Boot 3.2.0架构,结合百度OCR的高精度图像识别和DeepSeek的语义理解能力,显著提升了发票处理效率与准确率。关键技术包括多模型融合、智能错误纠正和自适应学习机制,实现了95%以上的识别准确率,将传统处理效率提升90%以上。该系统为数字化转型中的企业财务管理提供了智能化解决方案,具备高精度识别、实时处理、智能验证等核心优势。

博客 1628

【算法集训】Java实现之查找专题:寻找第K大、矩阵元素查找、在两个长度相等的排序数组中找到上中位数

Java实现之查找专题:寻找第K大、矩阵元素查找、在两个长度相等的排序数组中找到上中位数。

农夫的码,没有草原 709

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NC 在两个长度相等的排序数组中找到上中位数

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述给定两个递增数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,为第n/2个数// 假设两个数组为一个数组,先算出上中位数的位置。// 记录走过的次数 int index = 0;// 存放最新的走过的值 int res = arr1 [ 0 ];

pleaseprintf的博客 437

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode-Median of Two Sorted Arrays

代码如下: package com.leetcode.study; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class Main { public static void main...

weixin_30823833的博客 87

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

题目点我 寻找两个有序数组的中位数 思路:寻找中位数转换为寻找顺序排在中间的「最小值」是多少(两个数组总长度为双数时,寻找排在中间的两个最小值) step 1 首先处理两个长度各自相等的情况,该情况下,讲其中一个数组尾部追加一个 MAXINT 值用以占位(该值不会参与后续计算过程) 其他情况下,初始中位 n1,n2 的下标即可从较长数组中得到(n2 在单数的时候不需要管) +---------...

qq_35637650的博客 187

寻找两个正序数组中位数

/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number} */ var findMedianSortedArrays = function(nums1, nums2) { //构造新的数组 let mynum = [] let i = 0, j = 0,temp = 0 for(;i < nums1.length; i++){ if(j == nums2.

qq_41199852的博客 331

两个排序数组的中位数

http://blog.youkuaiyun.com/alexingcool/article/details/7932441 求两个排序数组中位数,这道题是很有意思的一道题目,算法导论中9.3-8题,这题必须在O(logn)的时间复杂度求解,否则肯定悲剧。。。 这题有个关键的条件,那就是这两个数组长度相等 思路如下: 数组A:1, 3, 5, 7, 9 数组B:2, 4,

wuxinliulei的专栏 1192

leetcode 462. 最少移动次数使数组元素相等 II python实现

一.题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。 二.示例 三.算法分析 先对列表进行排序,防止得到不是最小的移动步数,然后根据列表长度分奇偶得到对应中位数,求得列表元素与中位数相减取绝对值求和则为最小移动步数。 四.算法实现 class Solut...

知其然,知其所以然 619

【中等】在两个长度相等的排序数组中找到上中位数-Java

package live.every.day.ProgrammingDesign.CodingInterviewGuide.Other; /** * 在两个长度相等的排序数组中找到上中位数 * * 【题目】 * 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 * * 【举例】 * arr1=[1,2,3,4],arr2=[3,4,5,6] * 总共有8个数,那么上中位数是第4小的数,所以返回3。 * arr1=[0,1,2],arr2=[3,

了解➔熟悉➔掌握➔精通 400

LeetCode - 462. 最少移动次数使数组元素相等 II

462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。 例如: 输入: [1,2,3] 输出: 2 说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): [1,2,3] => [2,2,3] => [2,2,2] 解...

virgilshi的博客 363

LeetCode. 寻找两个有序数组的中位数(二分技巧 + 边界处理问题)

核心讲解可参考:https://blog.youkuaiyun.com/hit1110310422/article/details/80865539 i 值用于切割nums1,j 用于切割num2 对 nums1数组 进行二分查找,搜寻到恰好符合要求的 i 值 要求: B[ j − 1 ] ≤ A[ i ] 且 A[ i - 1 ] ≤ B[ j ] 前提需要满足 : 1、Length(nums1...

一只热爱游戏的猫咪 479

使子数组元素和相等(中位数贪心+裴蜀定理)超详细

使子数组元素和相等(中位数贪心+裴蜀定理)超详细

千天夜的博客 641
上一篇: 算法总结之 一行代码求两个数的最大公约数
下一篇: 算法总结之 在两个排序数组中找到第K小的数
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值