寻找两个正序数组的中位数O(log[min(m,n)])时间复杂度的解题记录

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

坐标力扣:

曾经做这题时,卡了我很长时间。现在故地重游,仍然重蹈覆辙。

所以我很有必要记录下这条题目。


要达到如题的时间复杂度,不难想到,所用的方法一定和二分法有关系。

甚至多想想也能想出大概的方法:分别设两个指针cut1,cut2,将第一个数组切割成 left1和right1,将第二个数组切割成left2和right2,用二分查找 找到left1和left2中的数都小于等于right1和right2中的数,则中位数在两个cut处产生。(我讲的远远没有leetcode里面各位大佬的题解详细,值得去一看)。

但是,这其中的很多边界,细节等,便是真正的难点所在。

m+n为奇数怎么办,为偶数怎么办,cut越界怎么办······

考虑到各个方面,正真要写出代码还是很困难的。

于是我想出了目前对我来说最容易理解的思路:

若m+n为偶数,不谈,就希望他是偶数,因为这样的话中位数就=(左边最大数+右边最小数)/2.0。

若m+n为奇数,这就很令人头秃。这里我提供一个比较巧妙的思路:

例如两个数组nums1=[1,3,5] nums2=[2,4]。

寻找这两个数组中的中位数  其实就相当于寻找num1'=[1,1,3,3,5,5]和nuns2'=[2,2,4,4]两个数组的中位数
此刻数组长度总数变成了偶数,而变化后的数组中任意一个数字的下标/2等于原数组中这个数字的下标。

那么这个数组*2的变化我们并不需要实际实现,只是看成“虚拟数组”,利用这个虚拟数组更方便地控制原数组的下标关系。

而这个虚拟数组的操作对于m+n为偶数也适用。

奇妙吧,这样下来,就可以把m+n的奇偶情况统一起来了。

下面是代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m =nums1.size(),n=nums2.size();
        if(m>n)
            return findMedianSortedArrays(nums2,nums1);// 必须 让nums1的长度小于nums1否则的话m很大n很小,m二分的话会使得Nums2越界
        int c1,c2;
        int lo =-1,hi = 2*m;    //我们这里的c1  c2表示切割的左半部分的最后一个数字的下标 所以c1的范围为[-1,2*m] 
        int lmax1 ,lmax2,rmin1,rmin2;
        while(lo<hi)
        //-1 6 c1=2 c2=0
        {   //-1 2 c1=0,c2=2
            c1=floor((lo+hi)/2.0); //因为二分范围的左边界是-1  为了使得-1/2结果为-1 所以要用floor函数
            c2=m+n-2-c1;           //因为(c1+1)+(c2+1)=总数的一半=(2*m+2*n)/2
            
            lmax1 =c1<0?INT_MIN:nums1[c1/2]; //如果c1为-1的话,则nums1的切割全部属于右半边
            lmax2 =c2<0?INT_MIN:nums2[c2/2];//同上
            rmin1= c1>=2*m-1?INT_MAX:nums1[(c1+1)/2];//如果c1为2*m-1即最右边的话,nums1的切割全部属于左半边
            rmin2= c2>=2*n-1?INT_MAX:nums2[(c2+1)/2];//同理

            if(lmax1>rmin2)  
                hi=c1;
            else if (lmax2>rmin1)
                lo=c1+1;
            else   
                break;
        }
       return (min(rmin1,rmin2)+max(lmax1,lmax2))/2.0;
    }
};

 那么我这道题苦想了三天的意义是什么?学到了什么新知识?获得了什么新技能?

都没有。

那还有什么意义呢?

有。

再遇难题,我必从容自若。

时间复杂度为O(n)的找中位数算法源代码 立即下载

相关推荐

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 576

O(n)的时间复杂度求中位数

O(n)的时间复杂度求中位数 O(n)中位数问题是指:在O(n)的时间复杂度内找到一个无序序列的中位数。 在开始O(n)时间复杂度求中位数之前,先手写一下快速排序。 快速排序的实现 Reference: 快速排序|菜鸟教程 白话经典算法系列之六 快速排序 快速搞定 快速排序的原理 如果想正序排序一个序列: 从序列中找到一个 基准数 。 分区:将序列中比基准数大的数字都放到基准数的右边,将序列中比基准数小的数字都放在基准数的左边。 此时,序列被分成了三部分: 左序列 + 基准数 + 右序列。 实现2的方.

Histranger_的博客 1万+

三运放仪表放大器电路设计全解析:从原理到PCB布局避坑指南

本文深度解析三运放仪表放大器电路设计,从差分放大器原理演进到经典三运放架构,详细阐述了其高共模抑制比(CMRR)和高输入阻抗的核心优势。文章重点剖析了电阻匹配、PCB布局对称性等关键设计要点对性能的影响,并提供了基于LTspice的仿真分析与从原理图到PCB布局、焊接调试的全流程实战避坑指南,助力实现高精度信号调理。

redis7keeper的博客 786

寻找两个正序数组的中位数--二分法学习

寻找两个正序数组的中位数–二分法学习 给定两个大小为 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 = 2.5 分析 题目要求算法的时间复杂度为 O(l

爱打排球程序员的博客 616

告别手动处理:用 Bruker NSMatlabUtilities 工具箱批量分析 AFM 力曲线数据的实战案例

本文介绍了如何使用 Bruker NSMatlabUtilities 工具箱实现 AFM 力曲线数据的批量分析,解决传统手动处理耗时且易出错的问题。通过实战案例展示工具箱的核心功能,包括数据读取、力曲线分析和可视化,帮助科研人员提升数据处理效率和准确性。

weixin_28362173的博客 213

抽象代数学习笔记(抽象代数的历史、运算)

1. 抽象代数历史 对于五次及以上的代数方程是否存在根式解这个问题,欧拉、拉格朗日、高斯等数学家都没得到答案,但是他们得出五次及以上的代数方程组不存在根式解的结论。19世纪初,阿贝尔提出五次及以上的代数方程不存在根式解,并找出一类特殊的五次及以上的代数方程可以用根式解表示出来。另外一个年轻的数学家伽罗华...

huangzhpei的博客 3668

Leetcode刷题-4 寻找两个数组的中位数

题目介绍: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log(m+n)) 。 示例1 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 来源:力扣(LeetCode) 题目分析: 题目本身其实并不难理解,就是一个常见的合并然后查找中位数的问题,但是题目限定算法时间复杂度为O(log(m+n)) ,这就限制了我

ITSOK_123的博客 1352

基于强化学习的多无人机路径规划

我们使用了Dueling Double Deep Q-Network(DDDQN)算法来训练智能体,这个算法在深度Q学习算法的基础上进行了升级,具有更快的收敛速度和更好的性能。本文提出了一种基于强化学习的算法,实现了多无人机路径规划,并提供相应的MATLAB代码。通过基于强化学习的多无人机路径规划算法,我们能够高效地解决复杂环境下的任务需求,并在实际应用中取得了良好的效果。首先,我们定义了状态空间和动作空间。实验结果表明,我们的方法能够有效地解决多无人机路径规划问题,提高了任务完成的效率和准确率。

DjjPython的博客 820

找中位数

无序数组找中位数 排序后再找 时间复杂度为O(nlogn) 建立大小为n/2+1的最大堆,如果比堆顶大的则舍去如果是奇数则堆顶就是中位数 如果是偶数则取出两位求平均值 o(nlogk) parition操作 建立一个partition方法 partition(int[] arr , int start , int end){ int left = start; int right = end; ...

weixin_42446419的博客 437

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

nnn2188185的博客 357

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

给一列无序数组,求出中位数并给出算法的时间复杂度

若数组有奇数个元素,中位数是a[(n-1)/2];若数组有偶数个元素,中位数为a[n/2-1]和a[n/2]两个数的平均值。这里为方便起见,假设数组为奇数个元素。 思路一:把无序数组排好序,取出中间的元素。时间复杂度取决于排序算法,最快是快速排序,O(nlogn),或者是非比较的基数排序,时间为O(n),空间为O(n)。这明显不是我们想要的。 思路二:采用快速排序的分治partiti...

baika4211的博客 2927

基于逆向工程的中国裁判文书网爬虫技术深度解析

本文详细介绍了中国裁判文书网爬虫的开发过程,涵盖了从基础爬取到高级功能的完整解决方案。逆向工程分析:理解网站的反爬机制和加密逻辑浏览器自动化:使用Playwright模拟真实用户行为参数加密:通过JavaScript执行环境生成加密参数智能调度:控制请求频率,避免被检测错误处理:完善的异常处理和重试机制。

2201_76125261的博客 2145

Day5——LeetCode4.寻找两个正序数组的中位数&2364.统计环数对的数目

本来想按算法专题进行刷题,所以今天打算先从分治算法开始。于是选择了分治标签下的题目,看到一个寻找两个正序数组中位数的题,看题目感觉和在算法课上课后题差不多,而且此题还标注困难,遂点开开刷。

m0_73776993的博客 1329

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode 004. 寻找两个正序数组的中位数 - 二分切分与分治详解

题目描述:给定两个已按非降序排列的整数数组 nums1、nums2,设它们长度分别为 m 和 n,要求返回这两个数组合并后有序序列的中位数。整体期望时间复杂度为 O(log(m+n))。当总长度为偶数时,中位数为中间两个数的平均值(返回 double)。数组可能为空,但不会同时为空(若实现中遇到同时为空需返回默认值)。原题链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/难度等级:Hard。

m0_52114506的博客 1044

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【算法精讲】寻找两个正序数组的中位数:从暴力到最优解的进阶之路

若总长度为奇数,中位数是排序后数组中第len/2位置的元素(向下取整,索引从 0 开始);若总长度为偶数,中位数是排序后数组中第len/2 - 1和len/2位置元素的平均值。中位数的本质:将数组划分为长度相等的两部分,左≤右,这是二分划分的核心依据;二分查找的应用场景:对数级时间复杂度要求,优先考虑二分,且需选择较短数组减少查找次数;边界处理技巧:数组越界时用极值()简化判断;优化思路。

LUOMUJZ的博客 686

[刷题][lettcode困难]4.寻找两个正序数组的中位数

标签 : 数组,二分查找,分治。

l23456789mmmmm的博客 566

寻找两个正序数组的中位数:二分查找的终极算法

寻找两个正序数组中的中位数,如果把数组比作排队买奶茶的队伍,中位数就是那个站在正中间的幸运儿——不需要知道所有人的位置,只需要找到那个「刚刚好」的中间位置。这个问题看似简单,却藏着算法世界的「效率密码」,尤其是当要求时间复杂度达到O(log(m+n))时,就像要求兔子不仅要跑赢比赛,还要跑出博尔特的速度!

兔哥的技术 913

Leetcode 4.寻找两个正序数组的中位数(困难)

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 示例 3: 输入:nums1 = [0,0],

明朗晨光的专栏 691

寻找两个正序数组的中位数c语言,leetcode-4. 寻找两个正序数组的中位数,

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

weixin_34766991的博客 487

LeetCode 寻找两个正序数组的中位数(4题)

LeetCode 寻找两个正序数组的中位数(4题) @author:Jingdai @date:2021.03.14 题目描述(4题) 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 思路及代码 如果不考虑时间复杂度,可以很容易想到两种方法,一种是先将数组合并,然后进行排序后找中位数,时间复杂度是 O((m+n)*log(m+n));另一种是根据数组顺序进行合并,合并后就是有序的数组,然后在求中位数,时间复杂度是 O(m+n

qq_41512783的博客 547

Leetcode 4. 寻找两个正序数组的中位数 (数组划分+中位数位置搜索)

题解 题意:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 题解:此题主要是找到两个数组的中位数位置,不断地在两个数组中寻找合理的分割线位置。 中位数位置:(m+n)偶数:(m+n+1)/2的左右两边,m+n奇数:(m+n+1)/2所处元素。对于奇数来说,就是划分成两堆数据之后,奇数长度数组的中位数就在元素多一个的那边(如9个元素,划分成5+4,中位数就在5那一堆) 在两个数组

Einskai216的博客 450

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

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 来源:力扣(LeetCode) 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 方法一:合并数组 将两个数组合并为一个,遍

weixin_42846216的博客 154

LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法

本文介绍了LeetCode第4题"寻找两个正序数组的中位数"的最优解法。通过二分切割法,在不合并数组的情况下直接找到中位数。核心思路是将两个数组分割为左右两部分,确保左半部分整体小于等于右半部分,并满足长度平衡条件。文章详细解释了算法原理、边界处理和中位数计算方法,提供了Java实现代码,并分析了时间复杂度和空间复杂度。最后总结了算法核心思想,并解答了常见的面试问题。该方法时间复杂度为O(log(min(m,n))),是解决该问题的高效方案。

weixin_66162442的博客 298

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

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 提示: nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -10^6 <= nums1[i], nums2[i] <= 10^6 思路 字越少事越大系列…

min_coder的博客 647

LeeCode4.寻找两个正序数组的中位数。小白都能懂。

LeeCode4.寻找两个正序数组的中位数。小白都能懂。

qq_53445625的博客 518
上一篇: 用Python的tkinter库做一个简单的打包作业的工具
下一篇: 《方格取数》为什么要四维度数组
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值