二分查找----6.寻找两个正序数组的中位数

LeetCode 4. 寻找两个正序数组的中位数(多解法) 文章目录解法一:合并数组解法二:双指针解法三:二分解法三:进阶二分(划分数组) 解法一:合并数组 将两个数组合并后,直接根据下标找到中位数。时间复杂度O(m+n)O(m + n)O(m+n),空间复杂度 O(m+n)O(m + n)O(m+n) class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int n = nums1.length, m = nums2.length; 阅读详情

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

/**

        给定两个升序数组,将两数组看作整体寻找中位数;要求时间复杂度O(log (m+n)),则不能直接合并数组.

        大致解法:

                (暂时不考虑偶数情况)

                如果数组合并,那么在nums1与nums2中必然存在两个分割点,

                nums1的前i个元素与nums2的前j个元素构成合并后的左半区(包括中位数),

                中位数即为nums1前i个元素与nums2前j个元素中较大的那个,且i + j = (m + n + 1) / 2(兼容奇偶)

                同时满足左半区的最大值小于右半区的最小值

        左半区元素个数:

                i + j = (m + n + 1) / 2 ---> 左右半区元素个数相等(奇);左比右多1(偶);nums1取i个、nums2取j个

        分割合法性:

                左半区最大元素小于右半区最小元素

                nums1[i - 1] < nums1[i] (必然满足)

                nums1[i - 1] < nums2[j]

                nums2[j - 1] < nums2[j] (必然满足)

                nums2[j - 1] < nums1[i]  

        核心:

                那么中位数寻找就转变为了搜寻满足条件的i或j; i + j = (m + n + 1) / 2

                只需搜寻一个即可,哪个数组更短搜寻哪个即可

*/

class Solution {
    /**
        给定两个升序数组,将两数组看作整体寻找中位数;要求时间复杂度O(log (m+n)),则不能直接合并数组.
        大致解法:
                (暂时不考虑偶数情况)
                如果数组合并,那么在nums1与nums2中必然存在两个分割点,
                nums1的前i个元素与nums2的前j个元素构成合并后的左半区(包括中位数),
                中位数即为nums1前i个元素与nums2前j个元素中较大的那个,且i + j = (m + n + 1) / 2(兼容奇偶)
                同时满足左半区的最大值小于右半区的最小值
        左半区元素个数:
                i + j = (m + n + 1) / 2 ---> 左右半区元素个数相等(奇);左比右多1(偶);nums1取i个、nums2取j个
        分割合法性:
                左半区最大元素小于右半区最小元素
                nums1[i - 1] < nums1[i] (必然满足)
                nums1[i - 1] < nums2[j]
                nums2[j - 1] < nums2[j] (必然满足)
                nums2[j - 1] < nums1[i]   
        核心:
                那么中位数寻找就转变为了搜寻满足条件的i或j; i + j = (m + n + 1) / 2
                只需搜寻一个即可,哪个数组更短搜寻哪个即可
    */
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //保证nums1是较短的数组
        if(nums1.length > nums2.length) {
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }

        int m = nums1.length, n = nums2.length;
        
        //双指针置于nums1有效部分两端
        int left = 0, right = m; 

        while(left <= right) {
            int sumLeft = (m + n + 1) >>> 1; //左半区元素总数 i + j
            int i = (left + right) >>> 1; //二分查找搜寻满足条件的i(nums1中选取的元素数)
            int j = sumLeft - i; // j(nums2中选取的元素数)

            
            
            //边界处理,左半区完全在nums1或左半区完全在nums2;以及nums1或nums2全部需要
            int nums1Left = (i == 0) ? Integer.MIN_VALUE : nums1[i - 1]; //左半区完全在nums2
            int nums1Right = (i == m) ? Integer.MAX_VALUE : nums1[i]; //nums1全部需要
            int nums2Left = (j == 0) ? Integer.MIN_VALUE : nums2[j - 1]; //左半区完全在nums1
            int nums2Right = (j == n) ? Integer.MAX_VALUE : nums2[j]; //nums2全部需要
            

            //分割合法性
            /**  需进行边界处理,不可直接判断
            if(nums1[i - 1] <= nums2[j] && nums2[j - 1] <= nums1[i]) {
            */
            if(nums1Left <= nums2Right && nums2Left <= nums1Right) {
                
                if((m + n) % 2 == 1) { //奇数,返回左半区最大值即可
                    return Math.max(nums1Left, nums2Left);
                } else { //偶数,分割点左侧最大值以及分割点右侧最小值的平均值
                    return (Math.max(nums1Left,nums2Left) + Math.min(nums1Right,nums2Right)) / 2.0;
                }
            } 
            
            //分割不合法,分情况进行调整
            else {
                if( nums1Left > nums2Right) { //nums1选取元素数过大
                    right = i - 1; //减少nums1可选元素
                } 

                else if(nums2Left > nums1Right) { //nums2选取元素数过大
                   left = i + 1; //增多nums1可选元素、即减少nums2可选元素 (总数固定,此消彼长)
                }
            }
        }

        return -1;
    }  

}

leetcode-hot100-11二分查找 给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]思路:用两次二分查找,第一次找出第一个等于 target 的元素的位置,第二次找出最后一个等于 target 的元素的位置。 阅读详情

相关推荐

4.寻找两个正序数组的中位数 python

要找到两个正序数组的中位数,并且要求时间复杂度为 (O(\log(m+n))),可以使用二分查找的方法。通过这种方法,我们可以在 (O(\log(m+n))) 的时间复杂度内找到两个正序数组的中位数。解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5。输入:nums1 = [1,2], nums2 = [3,4]输入:nums1 = [1,3], nums2 = [2]算法的时间复杂度应该为 O(log (m+n))。解释:合并数组 = [1,2,3] ,中位数 2。

sysu63的博客 2372

算法:寻找两个正序数组的中位数。

给定两个大小为 m 和 n 的正序(从小到大)数组nums1 和nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。

孤芳不自赏 9688

Leetcode 寻找两个正序数组的中位数

条件说明该怎么调nums1左边太多(或太大)i要往左缩,(else 情况)nums1左边太少(或太小)i要往右扩,满足找到了合法划分直接 return 中位数。

985小菜鸡 1204

【一文解决】寻找两个正序数组的中位数(来源:力扣腾讯精选50题)

【一文搞定】寻找两个正序数组的中位数题目描述题目分析解法一 找第K大问题解法二 最近在努力做题~~ 昨天做到一道题没感觉还是挺有难度的……我看了半天终于把题解搞懂了,所以写一篇博客来整理一下~~~ 题目描述 这道题来源于力扣题库中的腾讯精选50题。 题目描述如下: 可以注意到题目难度为困难。 虽然评论区有不少大佬吐槽这题目都算困难?? 作为小白直觉自己太菜了……不过没关系,等我们把它搞懂了,这样的题目在我们这儿也就不是困难啦~~~ 从题目描述和给出的示例,我们可以大致了解题意是让我们将两个按照正序(升

Stella-F的博客 3967

LeetCode-4.寻找两个正序数组的中位数 C++实现

给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的。算法的时间复杂度应该为。2.00000合并数组 = [1,2,3] ,中位数 22.50000合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5。

2401_86645122的博客 2061

算法深入剖析:寻找两个正序数组的中位数

在算法的世界里,“寻找两个正序数组的中位数”是一道经典且具有挑战性的题目。它不仅考验我们对数组操作的熟练程度,还涉及到对时间复杂度和空间复杂度的精细把控。今天,就让我们一起来深入探究这道题目的解题思路、实现代码以及算法背后的精妙之处。

ly1379223878的博客 1161

力扣每日一题4:寻找两个正序数组的中位数

如果m+n是奇数,那么第(m+n)/2+1个数即是中位数,如果m+n是偶数,那么第(m+n)/2个数和第(m+n)/2+1个数的平均十就是中位数。我们依旧用两个指针i,j来遍历,不同的是,我们不需要生成一个新的数组,也不需要遍历完两个数组的所有数,只需遍历(m+n)/2+1个数,并且时刻记住最大的是b和不大于b的最大数a即可。待遍历完毕后,a就表示第(m+n)/2个数,b表示第(m+n)/2+1个数,如果(m+n)是奇数,那么b就是中位数,如果(m+n)是中位数,那么(a+b)/2就是中位数。

m0_73441691的博客 545

力扣(LeetCode)4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法: public static double findMedianSortedArra..

安卓开发&音视频开发 2万+

寻找两个正序数组的中位数(详细举例好理解)

leetcode题解

技术记录 956

4.寻找两个正序数组的中位数

摘要:本文探讨了在有序数组中寻找中位数的算法。暴力解法通过合并数组后排序(时间复杂度O(nlogn))或归并排序(O(m+n))实现。优化解法采用二分查找,将问题转化为寻找第k小元素或分割线位置,时间复杂度降至O(log(m+n))。文章详细介绍了两种优化方法:基于中位数分割线的方法和递归排除k/2元素的策略,强调了正确处理边界条件和奇偶长度情况的重要性。

qq_58516607的博客 1056

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

刷题记录 HOT100 二分查找-6:4. 寻找两个正序数组的中位数

难度:困难给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的。算法的时间复杂度应该为。2.00000合并数组 = [1,2,3] ,中位数 22.50000合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5。

weixin_44610684的博客 249

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 420

力扣Hot100系列14(Java)[二分查找]总结(搜索插入位置, 搜索二维矩阵,在排序数组中查找元素的第一个和最后一个位置,搜索旋转排序数组,寻找旋转排序数组中的最小值,寻找两个正序数组的中位数)

本文总结了力扣Hot100中关于二分查找的三道典型题目:搜索插入位置、搜索二维矩阵、查找元素的起始和结束位置。通过二分查找算法实现O(log n)时间复杂度,详细介绍了每题的解题步骤和代码实现,包括边界处理、中间值计算和循环终止条件等关键点。文中还提供了具体示例帮助理解算法执行过程,如处理目标值存在/不存在、插入位置计算等场景。这些题目展示了二分查找在有序数据中的高效应用,适用于快速定位和范围查询问题。

2402_89049045的博客 718

NI USB-8506 LIN通讯配置全攻略:从驱动安装到NI MAX硬件检测

本文详细介绍了NI USB-8506设备的LIN通讯配置全流程,从驱动安装到NI MAX硬件检测。重点讲解了NI-CAN和NI-XNET驱动的安装避坑技巧,以及LIN通讯参数配置的实战经验,帮助用户快速掌握车载LIN总线通讯技术,提升工作效率。

weixin_29171087的博客 600

LeetCode Hot 100(二分查找)

本文总结了5道二分查找相关的LeetCode题目及其解法: 搜索插入位置(35题):通过二分查找第一个>=target的位置 搜索二维矩阵(74题):将二维矩阵视为一维数组进行二分查找 查找元素的起始和结束位置(34题):利用两次二分查找确定范围 搜索旋转排序数组(33题):先找到旋转点再分别在两个有序部分查找 寻找旋转数组中的最小值(153题):通过比较中间值与首元素确定最小值位置 所有解法的时间复杂度均为O(logn),空间复杂度O(1)。对于4题还给出了寻找两个有序数组中位数的解法,时间复杂度O

qq_56642160的博客 640

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

hot100-二分查找

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)# 很巧妙的写法,可以只使用一个函数res = midelse:return res""""""# 我们只要想办法找到第一个等于target的下标1# 然后找到最后一个等于target的下标2# 所以其实是我们找到第一个大于等于的下标就是1# 我们找到的第一个大于的下标就是2时间复杂度:O(logn)空间复杂度:O(1)

m0_69649486的博客 432

使用STM32F103C8T6控制舵机丝滑运转附代码

使用STM32F103C8T6控制舵机丝滑运转原理和案例,附代码。

m0_63566592的博客 4238

使用n8n搭建服务器监控系统:从Webhook到Telegram告警的完整实现

本文介绍基于n8n工作流平台搭建轻量级服务器监控系统的完整方案,通过Webhook接收监控数据、Token认证、阈值检查和Telegram告警推送,实现7x24小时自动化监控。整个系统由7个可视化节点组成,支持CPU、内存、磁盘、网络流量等多维度指标监控,告警阈值可灵活配置。相比传统的Prometheus或Zabbix方案,配置更简单、资源消耗更低,适合1-50台中小规模服务器的监控需求。实测表明从部署到上线仅需30分钟,告警响应延迟小于1秒,完全满足生产环境要求。

todoitbo的博客 1万+

【l力扣hot100】二分查找专题|35、74、34、33、153、4

二分查找看似简单,却是面试中最容易"翻车"的题型之一。边界写 l < r 还是 l <= r?r = mid 还是 r = mid - 1?稍有不慎就会死循环或漏答案。本专题覆盖力扣 Hot 100 中所有二分相关题目,从最基础的搜索插入位置,到旋转数组找最小值、搜索目标值,再到两个正序数组的中位数,由浅入深,逐题拆解。每道题重点讲清三个问题:搜索空间怎么定、判断条件怎么写、边界怎么收缩。不背模板,理解本质,真正做到举一反三。

2401_87144364的博客 222

基于Python的Steam游戏评论与销量数据爬取及预测分析

随着数字游戏市场的蓬勃发展,Steam作为全球最大的数字游戏分发平台,积累了海量的游戏数据与玩家行为数据。本文旨在通过Python网络爬虫技术,采集Steam平台的游戏基本信息、玩家评论数据及销量相关信息,为后续的游戏评论情感分析与销量预测模型构建提供数据支持。本文将详细介绍使用requestsselenium等库实现Steam数据爬取的全过程,并提供完整的代码实现与数据处理方法。关键词:Steam;Python爬虫;数据采集;评论分析;销量预测。

2201_76125261的博客 855

《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数

《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数详解

m0_56069910的博客 8879

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【二分查找】——两个正序数组的中位数

给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。要求找出并返回这两个正序数组的中位数。算法的时间复杂度应该为Ologmn))。

weixin_47868976的博客 1611

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode第四题:寻找两个正序数组的中位数(Java)

题目:寻找两个正序数组的中位数 给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。 示例: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 方法一:合并成一个数组,找中间数。 不考虑最优解的情况下,第一反应就是这个思路。 public static double findMedianSortedArrays(int[] num...

巨坑的菜比的博客 4667

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 二分查找----5.寻找旋转排序数组中的最小值
下一篇: 栈----1.有效的括号
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值