From 2cd278ae91d06149fa2e1a32364d3722cbc55c1e Mon Sep 17 00:00:00 2001 From: shining-ai Date: Thu, 9 May 2024 17:33:37 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=E3=80=90Grind75Hard=E3=80=914=E5=95=8F?= =?UTF-8?q?=E7=9B=AE295.=20Find=20Median=20from=20Data=20Stream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 44 +++++++++++++++++++ .../level_2.py | 17 +++++++ .../level_3.py | 16 +++++++ 3 files changed, 77 insertions(+) create mode 100644 grind75_hard/04_295. Find Median from Data Stream/level_1.py create mode 100644 grind75_hard/04_295. Find Median from Data Stream/level_2.py create mode 100644 grind75_hard/04_295. Find Median from Data Stream/level_3.py diff --git a/grind75_hard/04_295. Find Median from Data Stream/level_1.py b/grind75_hard/04_295. Find Median from Data Stream/level_1.py new file mode 100644 index 0000000..8fd4ac8 --- /dev/null +++ b/grind75_hard/04_295. Find Median from Data Stream/level_1.py @@ -0,0 +1,44 @@ +# 毎回ソートする +# TimeOut +class MedianFinder: + def __init__(self): + self.nums = [] + + def addNum(self, num: int) -> None: + self.nums.append(num) + self.nums.sort() + + def findMedian(self) -> float: + if len(self.nums) % 2: + index = len(self.nums) // 2 + return float(self.nums[index]) + + else: + index = len(self.nums) // 2 + return (self.nums[index - 1] + self.nums[index]) / 2 + + +# heapを2つ使う +# 半分より大きい値をいれるheapと小さい値をいれるheapの2種類を使って真ん中の値を取得する +class MedianFinder: + + def __init__(self): + self.low_heap = [] + self.high_heap = [] + self.count = 0 + + def addNum(self, num: int) -> None: + heapq.heappush(self.high_heap, num) + high_min = heapq.heappop(self.high_heap) + heapq.heappush(self.low_heap, -high_min) # low_heapは降順にしたいので-1をかける + if len(self.high_heap) < len(self.low_heap): + low_max = -heapq.heappop(self.low_heap) + heapq.heappush(self.high_heap, low_max) + + def findMedian(self) -> float: + if (len(self.high_heap) + len(self.low_heap)) % 2: + return float(self.high_heap[0]) + else: + middle_low = -self.low_heap[0] + middle_high = self.high_heap[0] + return (middle_low + middle_high) / 2 diff --git a/grind75_hard/04_295. Find Median from Data Stream/level_2.py b/grind75_hard/04_295. Find Median from Data Stream/level_2.py new file mode 100644 index 0000000..93cdb3e --- /dev/null +++ b/grind75_hard/04_295. Find Median from Data Stream/level_2.py @@ -0,0 +1,17 @@ +# 挿入ソート的に解く +class MedianFinder: + + def __init__(self): + self.nums = [] + + def addNum(self, num: int) -> None: + index = bisect_left(self.nums, num) + self.nums.insert(index, num) + + def findMedian(self) -> float: + if len(self.nums) % 2: + return float(self.nums[len(self.nums) // 2]) + else: + high_index = len(self.nums) // 2 + low_index = high_index - 1 + return (self.nums[low_index] + self.nums[high_index]) / 2 diff --git a/grind75_hard/04_295. Find Median from Data Stream/level_3.py b/grind75_hard/04_295. Find Median from Data Stream/level_3.py new file mode 100644 index 0000000..be431f1 --- /dev/null +++ b/grind75_hard/04_295. Find Median from Data Stream/level_3.py @@ -0,0 +1,16 @@ +class MedianFinder: + + def __init__(self): + self.nums = [] + + def addNum(self, num: int) -> None: + index = bisect_left(self.nums, num) + self.nums.insert(index, num) + + def findMedian(self) -> float: + if len(self.nums) % 2: + return float(self.nums[len(self.nums) // 2]) + else: + high_index = len(self.nums) // 2 + low_index = high_index - 1 + return (self.nums[high_index] + self.nums[low_index]) / 2 From 89f9667dba83032a8df6630770206523a39c1121 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Fri, 10 May 2024 16:41:21 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E5=86=85=E5=AE=B9=E3=82=92=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_4.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 grind75_hard/04_295. Find Median from Data Stream/level_4.py diff --git a/grind75_hard/04_295. Find Median from Data Stream/level_4.py b/grind75_hard/04_295. Find Median from Data Stream/level_4.py new file mode 100644 index 0000000..8506318 --- /dev/null +++ b/grind75_hard/04_295. Find Median from Data Stream/level_4.py @@ -0,0 +1,15 @@ +class MedianFinder: + + def __init__(self): + self.nums = [] + + def addNum(self, num: int) -> None: + index = bisect_left(self.nums, num) + self.nums.insert(index, num) + + def findMedian(self) -> float: + if len(self.nums) % 2 == 1: + return float(self.nums[len(self.nums) // 2]) + high_index = len(self.nums) // 2 + low_index = high_index - 1 + return (self.nums[high_index] + self.nums[low_index]) / 2 From a46c6142cf0af3037135e4abfd9d5fc9b8b7c0b9 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sat, 11 May 2024 11:47:02 +0000 Subject: [PATCH 3/3] =?UTF-8?q?insort=5Fleft=E3=82=92=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_5.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 grind75_hard/04_295. Find Median from Data Stream/level_5.py diff --git a/grind75_hard/04_295. Find Median from Data Stream/level_5.py b/grind75_hard/04_295. Find Median from Data Stream/level_5.py new file mode 100644 index 0000000..f9b6a27 --- /dev/null +++ b/grind75_hard/04_295. Find Median from Data Stream/level_5.py @@ -0,0 +1,14 @@ +class MedianFinder: + + def __init__(self): + self.nums = [] + + def addNum(self, num: int) -> None: + index = insort_left(self.nums, num) + + def findMedian(self) -> float: + if len(self.nums) % 2 == 1: + return float(self.nums[len(self.nums) // 2]) + high_index = len(self.nums) // 2 + low_index = high_index - 1 + return (self.nums[high_index] + self.nums[low_index]) / 2