Perl实例---寻找两个有序数组的中位数:进阶解法

Posted EasyPerl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl实例---寻找两个有序数组的中位数:进阶解法相关的知识,希望对你有一定的参考价值。


题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,你可以假设 nums1 和 nums2 不会同时为空。如果m+n为偶数, 则取2中位数平均值。

还是上次的题目, 我们有没有更好的解决方法呢?首先, 我们可以把题目扩展开来, 取中位数就是取第x个元素, 那我们可以将算法扩展到取任意的第m个元素。



解题思路:使用归并排序的方法的时候, 我们是一个个的依次去掉元素,为了提高效率, 我们可以引入二分法来一批批的去掉元素, 每次我们去掉m/2个, 这样时间复杂度就是log型了。


具体如下:

my @nums1 = (1,3,5,9);

my @nums2 = (6,7,8,8,9);


my $m = 4;

my $count = 0;

my $m_val;

while($m > 0){

        边界检测, 当一个数组删除完后, 可以直接得到答案

if (@nums1 == 0){

$m_val = $nums2[$m - 1];

last;

}

if (@nums2 == 0){

$m_val = $nums2[$m - 1];

last;

}

        边界检测, 当删除完m-1个元素后, 直接一次比较, 就可以得到答案

if ($m == 1){

$m_val = $nums1[0] > $nums2[0] ? $nums2[0] : $nums1[0];

last;

}

my $n = int($m / 2);

if (@nums1 < $n){

$n = @nums1;

if (@nums2 < $n){

$n = @nums2;

if ($nums1[$n - 1] >= $nums2[$n - 1]){

splice(@nums2, 0, $n);

}else{

splice(@nums1, 0, $n);

}

$m -= $n;

$count += $n;

}

print "$m_val\n";


由于使用了二分法来删除元素, 因此时间复杂度是O(log(m+n)),空间复杂度仍然是O(1).

以上是关于Perl实例---寻找两个有序数组的中位数:进阶解法的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 寻找两个有序数组的中位数

[LeetCode] 4. 寻找两个有序数组的中位数

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

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

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

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