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 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 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