题目:
题解:
from sortedcontainers import SortedList
class MedianFinder:
def __init__(self):
self.nums = SortedList()
self.left = self.right = None
self.left_value = self.right_value = None
def addNum(self, num: int) -> None:
nums_ = self.nums
n = len(nums_)
nums_.add(num)
if n == 0:
self.left = self.right = 0
else:
# 模拟双指针,当 num 小于 self.left 或 self.right 指向的元素时,num 的加入会导致对应指针向右移动一个位置
if num < self.left_value:
self.left += 1
if num < self.right_value:
self.right += 1
if n & 1:
if num < self.left_value:
self.left -= 1
else:
self.right += 1
else:
if self.left_value < num < self.right_value:
self.left += 1
self.right -= 1
elif num >= self.right_value:
self.left += 1
else:
self.right -= 1
self.left = self.right
self.left_value = nums_[self.left]
self.right_value = nums_[self.right]
def findMedian(self) -> float:
return (self.left_value + self.right_value) / 2