两个排序数组的中位数,“最”有技术含量的解法!
这是我参与 11 月更文挑战的第 11 天。
一、写在前面
LeetCode 第一题两数之和传输门:听说你还在写双层for循环解两数之和?
今天给大家分享的是 LeetCode 数组与字符串 第二题:两个排序数组的中位数,为面试而生,期待你的加入。
二、今日题目
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。 要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例:
三、 分析
这个题目好像比第一个题目还要更简单一些,唯一一点可能让大家犯迷糊的地方就是要求时间复杂度为 O(log (m+n)),什么是时间复杂度呢?
算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,一般用 O 表示,一般我们根据一段代码里,代码重复执行的次数来定义时间复杂度,如果是一个常数 n,我们就说算法时间复杂度为 O(1),类似的还有 O(x),O(x^2),O(logx)...
四、解题
方法一:这是我见这个题目第一眼就想到的方法,分三步:<br>1.两个数组拼接,排序<br>2.测拼接后数组长度,判断奇偶<br>3.测出中位数下标,求出中位数
简化该思想:
运行结果
测试数据:2084 组<br>运行时间:64ms<br>击败人百分比:95.31%
方法二:方法一中排序我们是直接调用了内置函数
sort
,当然,我们也可以自己实现排序算法,然后和方法一一样的思想执行。
测试数据:2084 组<br>运行时间:64ms<br>击败人百分比:95.31%<br>居然与方法一一模一样?不可信。
方法三:这个比较有意思,哈哈哈,也就是比较有技术含量。递归寻找中间数,主要思想是通过递归,利用二分查找的思想每次剔除大范围元素提高搜索效率,不断缩小中位数所在范围,欢迎交流讨论。
运行结果
测试数据:2084 组 <br>运行时间:116ms <br>击败人百分比:88.65%
五、疑惑
留一个问题给大家,上面的几种方法的时间复杂度到底是多少?计算过程?欢迎大家评论区交流呀~
六、结语
怎么说呢?算法这个东西就是你入门了,就会觉得特别有意思,可能你会因为某个算法茶饭不思,掉几百根头发,死几千个脑细胞,但是最后你还是高兴的,如果你没入门,思想没有转变过来,可能你会因为算法死几亿个脑细胞,掉光头发,哈哈哈哈。(以上只是老表个人看法)
坚持 and 努力 : 终有所获。
思想很复杂,
实现很有趣,
只要不放弃,
终有成名日。
—《老表打油诗》
下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!
版权声明: 本文为 InfoQ 作者【老表】的原创文章。
原文链接:【http://xie.infoq.cn/article/a6f6b4c3c9000ce882432b6cb】。文章转载请联系作者。
评论