Skip to content

Commit d83fc58

Browse files
committed
Median Stream
1 parent 1cab5bd commit d83fc58

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

Heap/MedianStream.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Hakam\LeetCodePhp\Heap;
4+
5+
use SplMinHeap;
6+
7+
class MedianStream
8+
{
9+
public function findMedian($arr): array
10+
{
11+
for ($key = 1, $keyMax = count($arr); $key <= $keyMax; $key++) {
12+
$minHeap = new SplMinHeap();
13+
14+
for ($index = 0; $index < $key; $index++) {
15+
16+
$minHeap->insert($arr[$index]);
17+
}
18+
19+
if ($key === 1) {
20+
$temp = $minHeap->extract();
21+
$maiden [] = $temp;
22+
continue;
23+
}
24+
25+
if ($key === 2) {
26+
$temp = floor(($minHeap->extract() + $minHeap->extract()) / 2);
27+
$maiden [] = $temp;
28+
continue;
29+
}
30+
31+
if ($key % 2 === 0) {
32+
for ($i = 0; $i < ($key / 2) - 1; $i++) {
33+
$minHeap->extract();
34+
}
35+
$temp = floor(($minHeap->extract() + $minHeap->extract()) / 2);
36+
} else {
37+
38+
for ($i = 0; $i < floor($key / 2); $i++) {
39+
$minHeap->extract();
40+
}
41+
42+
$temp = $minHeap->extract();
43+
44+
}
45+
46+
$maiden [] = $temp;
47+
48+
}
49+
return $maiden;
50+
}
51+
}

Tests/Heap/MedianStreamTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Hakam\LeetCodePhp\Tests\Heap;
4+
5+
use Hakam\LeetCodePhp\Heap\MedianStream;
6+
use Hakam\LeetCodePhp\Tests\Helper\MainTest;
7+
8+
class MedianStreamTest extends MainTest
9+
{
10+
/**
11+
* @dataProvider provideData
12+
*/
13+
public function testWithDataList($expectedResult, $inputData): void
14+
{
15+
$medianStream = new MedianStream();
16+
self::assertEmpty(array_diff($expectedResult,$medianStream->findMedian($inputData)));
17+
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"testCase1": {
3+
"expectedResult": [5, 10, 5, 4],
4+
"input": [5, 15, 1, 3]
5+
},
6+
"testCase2": {
7+
"expectedResult": [1,1],
8+
"input": [1,2]
9+
}
10+
}

0 commit comments

Comments
 (0)