My question is with reference to Method 2 of this link. Here two equal length sorted arrays are given and we have to find the median of the two arrays merged.
PHP Solution:
function Solve( $aArrayOne, $aArrayTwo )
{
// Base case
if( empty( $aArrayOne ) || empty( $aArrayTwo ) )
{
return false;
}
$iCountOne = count( $aArrayOne );
$iCountTwo = count( $aArrayTwo );
// Single value arrays base case
if( $iCountOne === 1 && $iCountOne === $iCountTwo )
{
return ( $aArrayOne[ 0 ] + $aArrayTwo[ 0 ] ) / 2;
}
$iTotalElements = $iCountOne + $iCountTwo;
$iHalfElements = floor( $iTotalElements / 2 );
$aPartial = [];
$n = 0;
// Append elements to new combined array until midway point
while( $n <= $iHalfElements )
{
// Compared both of the first elements to get the
// smallest one into the partial array
if( $aArrayOne[ 0 ] <= $aArrayTwo[ 0 ] )
{
$aPartial[] = array_shift( $aArrayOne );
}
else
{
$aPartial[] = array_shift( $aArrayTwo );
}
++$n;
}
// Check to see if we have an odd or an even array for final element math.
$bIsOddAndPrecise = $iTotalElements % 2;
$iMedian = ( $bIsOddAndPrecise )
? $aPartial[ $n - 1 ]
: ( $aPartial[ $n - 1 ] + $aPartial[ $n - 2 ] ) / 2;
return $iMedian;
}
Use cases tested:
// $aArrayOne = [1, 3, 4 ];
// $aArrayTwo = [1, 2, 3 ];
// EXPECTED 1,1,2,3,3,4 -> (2+3)/2 2.5
// $aArrayOne = [1, 3, 4, 7, 8, 11, 44, 55, 62];
// $aArrayTwo = [2, 4, 5, 7, 33, 56, 77];
// Expected: 1,2,3,4,4,5,7,7,8,11,33,44,55,56,62,77 -> (7+8)/2 7.5
// $aArrayOne = [1, 3, 4 ];
// $aArrayTwo = [ 100, 100];
// EXPECTED 1,3,4,100,100 -> 4
// $aArrayOne = [1,5,8,10];
// $aArrayTwo = [7,9,14,];
// EXPECTED 1,2,7,8,9,10,14 - > 8
// $aArrayOne = [1,5,8,10];
// $aArrayTwo = [7];
// EXPECTED 1,5,7,8,10 - > 7
// $aArrayOne = [1,5,10];
// $aArrayTwo = [50, 50];
// EXPECTED 1,5,10,50,50 - > 10
// $aArrayOne = [50, 50];
// $aArrayTwo = [1,5,10];
// EXPECTED 1,5,10,50,50 - > 10
// $aArrayOne = [1];
// $aArrayTwo = [1];
// EXPECTED-> 1
// $aArrayOne = [100, 100];
// $aArrayTwo = [100];
// EXPECTED -> 100