【LeetCode】4. Median of Two Sorted Arrays

微软面试模拟题 Leetcode 4 两个排序数组找到第k小的数 这道题目比较难,首先与面试管沟通整体思路: 先取第一个数组的第k/2个数,和第二个数组的第k-k/2个数,如果这两个数相等,那么这个数就是第k小的数。 如果第一个数组的第k/2个数小于第二个数组的第k-k/2个数,那么答案一定不可能在第一个数组的start1到start1+k/2-1, 以及第二个数组的第k-k/2+1到end2,同时这个数就一定能砍掉na。 可以用反证法来证明,假设在第一个数组第k/2个数之前,那么相加一定超过k。如果在第二个数组的k-k/2之后,也会矛盾。 同理反过来也一样。 阅读详情

题目描述:

给定两个已排序的整数数列(长度分别为m和n),求出他们的中位数。要求时间复杂度为O(log (m+n)).

如:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0


nums1 = [1, 2]
nums2 = [3, 4]

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


题目分析:

由于题目要求时间复杂度为O(log (m+n)), 看到log这个运算符,很容易想到要使用分治算法。

可以把题目进行转换:找到两个有序数列的第k个元素。

对于合并数列长度为奇数的,其中位数为合并后中间的数字;对于合并数列长度为偶数的,其中位数为合并后中间的两个数字的平均值。


典型的分治算法如二分法,每次选择中间的元素,与需要查找的元素进行比较,然后可以缩减一半的查找范围,时间复杂度为O(log(n)),每次减半的变量为搜索区间的长度。


对于本道题,首先可以想,需要将哪一个变量进行减半。可能能减半的变量有:两个序列的长度,查找合并数列的第k个元素的k.

这里选择从k入手,对k实行减半。


图一


为了简化计算,假设第一个数列的长度小于等于第二个数列的长度

我们从第一个数列尽可能选取k/2个数,sa = min(k/2, alen), alen为nums1上的查找长度,查找长度将为减少,记取出的数的最后一个数为A.

然后从第二个数列中取出k - sa个数,记取出的最后一个数为B

取出的数总长度为k


当A < B时,合并后的数列为:

图二


其中,点A前面黄色的部分为<=A的数,长度小于k; 而橙色部分为>=A且<=B的数。

在图一的第一个数列中,由于A<B, A后面还可能存在着<B的数,因此图二橙色部分的长度大于等于0

故黄色加橙色的长度大于等于k

所以第k大数在橙色部分,我们可以得知黄色部分肯定不存在第k大数,故可以在下次搜索时忽略黄色段。

但黄色段包括数列一和数列二的元素,要实现起来有点麻烦。

由有序性,黄色段包含了点A前面的元素,由之前的取法知这些元素个数尽可能接近k/2.

因此可以将k减半。


不失一般性A > B时也类似处理。


当A = B时,说明正好找到了第k大元素。


如何忽略前面的元素,可以记每次搜索的序列为nums1[i, nums1.size()), nums2[j, nums2.size())


示例代码:

class Solution {
public:

int kth(vector<int> &nums1, int i, vector<int> &nums2, int j, int k){
	// [i, nums1.size())
	// [j, nums2.size())
	int alen = nums1.size() - i;
	int blen = nums2.size() - j;
	if (alen > blen)return kth(nums2,j,nums1,i,k);
	if (alen == 0)return nums2[j + k - 1];
	if (k == 1)return min(nums1[i], nums2[j]);
	int sa = min(k / 2,alen);
	int sb = k - sa;
	int pa = i + sa - 1;
	int pb = j + sb - 1;
	if (nums1[pa] < nums2[pb])return kth(nums1, pa + 1, nums2, j, k - sa);
	if (nums1[pa] > nums2[pb])return kth(nums1, i, nums2, pb + 1, k - sb);
	return nums1[pa];
}

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int alen = nums1.size();
        int blen = nums2.size();
        int mid = (alen + blen) / 2;
        if ((alen + blen) & 1){
            //奇数
            return kth(nums1, 0, nums2, 0, mid + 1);
        }
        //偶数
        return (kth(nums1, 0, nums2, 0, mid) + kth(nums1, 0, nums2, 0, mid + 1))/ 2.0; 
    }
};



图解LeetCode4:Median of Two Sorted Arrays 文章目录理解题意思路1:最直观解法思路2:二分查找代码实现结论 Leetcode算法系列将详细讲解一些经典的面试算法题。 今天的算法是LeetCode中第四个题目,Median of Two Sorted Arrays,也就是给定两个有序数组求出中位数。   理解题意 首先给定的是两个有序数组,比如{1,3}以及{2},那么合并这两个数组就是{1,2,3},因此很显然中位数是2; 再给定... 阅读详情

相关推荐

大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题

本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。

weixin_27945229的博客 244

leetcode 第4题

leetcode 第4题

每日三省吾身,按时吃饭否 按时睡觉否 按时喝水否 820

C++动态规划详解

动态规划思想 一、动态规划概念: 动态规划(dp)是研究多步决策过程最优化问题的一种数学方法。在动态规划中,为了寻找一个问题的最优解(即最优决策过程),将整个问题划分成若干个相应的阶段,并在每个阶段都根据先前所作出的决策作出当前阶段最优决策,进而得出整个问题的最优解。即记住已知问题的答案,在已知的答案的基础上解决未知的问题。 在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后

weixin_51951103的博客 2万+

[日常刷题]leetcode第四天

20. Valid Parentheses Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. An input string is valid if: 1.Open brackets must be clo...

我在等那么一天的博客 360

黏菌算法(Slime Mould Algorithm,SMA)

这是一篇关于黏菌算法的总结博客,包含算法思想,算法步骤,求函数最值(Python实现),算法改进等,持续更新ing

weixin_46838605的博客 1万+

数学建模传染病模型_【数学建模】之传染病模型

点击【拇指笔记】,关注我的公众号。SE模型缺点:没有考虑接触到的人中还有一部分病人,所以所有人并不会全部被感染。建立模型:已感染人数(病人)每个病人每天有效接触(足以使人致病)人数为根据(1)(2)可以建立模型:等式两边同时除以\Delta t由导数定义有同时,取\Delta t = 1天由(1)(5)两式可得最终的模型:Logistic模型缺点:区分已感染者(病人)和未感染者(健康人)...

weixin_39590453的博客 2228

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)). Solution: Code: class Solution

HolyDominat的专栏 442

Delphi 12.3 精简绿色版下载

Delphi精简绿色版基于原版安装,去掉了InterBase、法语、德语、日语,只保留了Delphi Windows 32和Delphi Windows 64桌面开发,其余部分未做任何修改。Delphi精简绿色版不含任何破解,仅供学习和研究,24小时后请自行删除,如需继续使用Delphi,请购买正版。绿色版基于原版安装,未做任何精简和修改。绿色版不含任何破解,仅供学习和研究,24小时后请自行删除,如需继续使用RAD Studio,请购买正版。

全粘工程师 4309

AcWing 786 第k个数(快排模板裸题)

给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第k小数。 数据范围 1≤n≤100000, 1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 快排模板裸题 #include<iostream> using namespace std; const int N=1e6+10; in

小新的博客 263

集成电路设计笔记(七)UVLO设计

1. 什么是UVLO 欠压锁定(Undervoltage-Lockout)简称UVLO,是电子设备中在电源电压低于正常工程准位时,切断电源的电路。在嵌入式系统中常会用UVLO监控电池电压,若电压低于一定值,会直接切断电源,保护嵌入式系统的电路。 许多电子设备中都有UVLO的功能,例如在镇流器中就有UVLO电路,若电压过低时直接切断电源。 UVLO就是低电压锁定; 低压关断. 欠压关断模式是当供电电压低于IC的开启门限电压时的一种保护模式。欠压关断模式可保证IC在供电电压不足时不致于被损坏。一个低电压锁定(

ccbirds 2万+

基于51单片机的贪吃蛇游戏设计

本科时候做的一个课程作业,自己打一个很简易的电路,比较有意思且易上手,故将之记录下来。(全套的仿真及代码,演示视频,课程报告以及PPT展示上传在优快云下载区) 一. 实验目的 (1) 通过对C51语言的理解,编写程序实现对贪吃蛇的有效控制; (2) 通过对51单片机硬件的学习,学会运用面包板,独立按键、点阵屏等,完成对完整电路的搭建过程; (3) 通过对Proteus仿真软件的学习,实现基于STC89C52单片机的8*8点阵贪吃蛇的硬件电路仿真。 二. 实验介绍 贪吃蛇是一款经典小游戏,其游戏的规则是:玩

山山の十三先生 2万+

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

孑辞的博客 412

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+

LeetCode 4. Median of Two Sorted Arrays 题解

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

cannonjinx的博客 1009

IDEA的使用指南

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

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

Leetcode 4 Median of Two Sorted Arrays

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

思维决定一切 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

【LeetCode】解题4:Median of Two Sorted Arrays

LeetCode解题 4:Median of Two Sorted Arrays Problem 4: Median of Two Sorted Arrays [Hard]解题思路Solution (Java)修改过程 Problem 4: Median of Two Sorted Arrays [Hard] There are two sorted arrays nums1 and nums2 ...

Fayedily的博客 332

LeetCode4. Median of Two Sorted Arrays

之前没钻研过LeetCode,上次做题时,以为要找什么类型的题目就在搜索栏输入对应的关键词,结果输入divide-and-conquer才搜到一题,后来经提醒才知道在网页右侧有个提供各种关键词的topics框部,点击了divide-and-conquer便搜到了好多道相关题目,方便许多。之前真是太蠢了。 这次选择的是第4题:Median of Two Sorted Arrays  难度系数为H

reborncgy的博客 355

Leetcode-4 Median of Two Sorted Arrays 做题总结

一、介绍 这是Leetcode中的第4个题目,可以说,很多按照顺序刷题的同学,刷着刷着,突然就碰到了这个题目,然后就懵逼了。特别是看到了上面说的时间复杂度限制为O(log (m+n))的时候,感觉难以下手。其实我也是哈哈哈,但我没有按照顺序做题,而是在顺序的基础上,做完一个题目之后,根据accepted页面下,Next challenges来做,如图所示: ...

一点点博客 395

[leetcode] 4. Median of Two Sorted Arrays

Description 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)). You may assume n...

Learning from the mistakes 264

LeetCode 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+n)). 思路: 本题要求出两个有序数组的中位

wshish920907的博客 1972

leetcode 4 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)). 看到题目,首先想到的是 把2个数组合并成一个,然后在去中间位

大三狗现在才努力还不算晚吧?! 3495

leetcode 4 median of two sorted arrays

leetcode 4 median of two sorted arrays本文给出leetcode第四题Median of Two Sorted Arrays的答案及所用到的简单知识总结,适用于C++初学者 本文代码下载地址目录leetcode 4 median of two sorted arrays目录 题目 插入法题目There are two sorted arrays nums1 an

Alice lr的博客 420
上一篇: 【LeetCode】126. Word Ladder II
下一篇: 【LeetCode】2. Add Two Numbers
枫叶果酱
博客等级 码龄10年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值