php寻找两个有序数组的中位数,LeetCode PHP题解 4. 寻找两个正序数组的中位数

LeetCode PHP题解 4. 寻找两个正序数组的中位数2020-11-07 01:26:28

php寻找两个有序数组的中位数,LeetCode PHP题解 4. 寻找两个正序数组的中位数_第1张图片 题目链接

4. 寻找两个正序数组的中位数 难度:hard

有点类似TopK问题,只是这里是有有序的,二分找到中位数即可。解法1.合并排序

暴力解法,略过不提2.二分求中位数

将两个数组切割,假设A数组长度为m,切割位置为i,B数组长度为n,切割位置为j,则有:左半部分的长度等于右半部分,即:

i + j = m - i + n - j , 也就是 j = ( m + n ) / 2 - i

(当 A 数组和 B 数组的总长度是奇数时,j = ( m + n + 1) / 2 - i)

由于向下取整,故而j = ( m + n ) / 2 - i和j = ( m + n + 1) / 2 - i结果是一致的

此时,只要满足max ( A [ i - 1 ] , B [ j - 1 ])) <= min ( A [ i ] , B [ j ]))即找到了中位数复杂度分析时间复杂度:O(min(m,n)),其中 m,n 为两个数组的长度。我们对长度较短的数组进行二分。空间复杂度:O(1)。

以下为PHP语言实现~~~~class Solution {

/**

* @param Integer[] $nums1

* @param Integer[] $nums2

* @return Float

*/

function findMedianSortedArrays($nums1, $nums2) {

$a = $nums1;

$b = $nums2;

$m = count($a);

$n = count($b);

if ($m > $n) {

$tmp = $a;

$a = $b;

$b = $tmp;

list($m,$n) = [$n,$m];

}

$mid = (int)(($m+$n+1)/2);

$i_min = 0;

$i_max = $m;

$count = 0;

while ($i_min <= $i_max) {

$i = (int)(($i_min + $i_max)/2);

$j = $mid - $i;

if ($i < $i_max && $b[$j-1] > $a[$i] ) {

$i_min=$i+1;

}elseif ($i > $i_min && $a[$i-1] > $b[$j]) {

$i_max=$i-1;

}else{

if ($i == 0) {

$max_left = $b[$j-1];

}elseif ($j == 0) {

$max_left = $a[$i-1];

}else{

$max_left = $a[$i-1] > $b[$j-1] ?$a[$i-1]:$b[$j-1];

}

if (($m+$n)%2 == 1) {

return $max_left;

}

if ($i == $m) {

$min_right = $b[$j];

}elseif ($j == $n) {

$min_right = $a[$i];

}else{

$min_right = $a[$i] < $b[$j] ?$a[$i]:$b[$j];

}

$res = ($max_left+$min_right)/2;

return $res;

}

}

}

}

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系([email protected]),我们将及时处理。PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。

Tags 标签leetcodephp

扩展阅读

你可能感兴趣的:(php寻找两个有序数组的中位数)