这题只能用最小最大堆做,二分法插入也太慢。
翻到最下面有C++的大佬的参考答案。
这种题目好意思叫中等题?考试你用半个小时手写一个堆的定义出来?
用例通过率: 100.00% 运行时间: 2751ms 占用内存: 33024KB。
代码源自https://blog.csdn.net/qq_34342154/article/details/78454581?utm_source=blogxgwz8
class HeapNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
self.parent = None
class MyHeap:
def __init__(self, comp):
self.head = None #堆头节点
self.last = None #堆尾节点
self.size = 0 #当前堆的大小
self.comp = comp #基于比较器决定是大根堆还是小根堆
def getHead(self):
return self.head.value if self.head != None else None
def getSize(self):
return self.size
def isEmpty(self):
return True if self.size == 0 else False
#添加一个新节点到堆中
def add(self, value):
newNode = HeapNode(value)
if self.size == 0:
self.head = newNode
self.last = newNode
self.size = 1
return
node = self.last
parent = node.parent
#找到尾节点的下一个位置并插入新节点
while parent != None and parent.left != node:
node = parent
parent = node.parent
if parent == None:
nodeToAdd = self.mostLeft(self.head)
nodeToAdd.left = newNode
newNode.parent = nodeToAdd
elif parent.right == None:
parent.right = newNode
newNode.parent = parent
else:
nodeToAdd = self.mostLeft(parent.right)
nodeToAdd.left = newNode
newNode.parent = nodeToAdd
self.last = newNode
#建堆过程及其调整
self.heapInsertModify()
self.size += 1
def heapInsertModify(self):
node = self.last
parent = node.parent
if parent != None and self.comp(parent.value, node.value):
self.last = node.parent
while parent != None and self.comp(parent.value, node.value):
self.swapClosedTwoNode(node, parent)
parent = node.parent
if self.head.parent != None:
self.head = self.head.parent
def swapClosedTwoNode(self, node, parent):
if node == None or parent == None:
return
parentParent = parent.parent
parentLeft = parent.left
parentRight = parent.right
nodeLeft = node.left
nodeRight = node.right
node.parent = parentParent
if parentParent != None:
if parentParent.left == parent:
parentParent.left = node
else:
parentParent.right = node
parent.parent = node
if nodeLeft != None:
nodeLeft.parent = parent
if nodeRight != None:
nodeRight.parent = parent
if node == parentLeft:
node.left = parent
node.right = parentRight
if parentRight != None:
parentRight.parent = node
else:
node.left = parentLeft
node.right = parent
if parentLeft != None:
parentLeft.parent = node
parent.left = nodeLeft
parent.right = nodeRight
def mostLeft(self,node):
while node.left != None:
node = node.left
return node
def mostRight(self, node):
while node.right != None:
node = node.right
return node
def popHead(self):
if self.size == 0:
return None
res = self.head
if self.size == 1:
self.head = None
self.last = None
self.size = 0
return res.value
oldLast = self.popLastAndSetPreviousLast() #返回尾节点并更新尾节点
#如果弹出尾节点,堆的大小等于1的处理
if self.size == 1:
self.head = oldLast
self.last = oldLast
return res.value
#如果弹出尾节点,堆的大小大于1的处理
headLeft = res.left
headRight = res.right
oldLast.left = headLeft
if headLeft != None:
headLeft.parent = oldLast
oldLast.right = headRight
if headRight != None:
headRight.parent = oldLast
res.left = None
res.right = None
self.head = oldLast
#堆heapify过程
self.heapify(self.head)
return res.value
def heapify(self, node):
left = node.left
right = node.right
most = node
while left != None:
if left != None and self.comp(most.value, left.value):
most = left
if right != None and self.comp(most.value, right.value):
most = right
if most == node:
break
else:
self.swapClosedTwoNode(most, node)
left = node.left
right = node.right
most = node
if node.parent == self.last:
self.last = node
while node.parent != None:
node = node.parent
self.head = node
def popLastAndSetPreviousLast(self):
node = self.last
parent = node.parent #以下是寻找尾节点的上一个节点
while parent != None and parent.right != node:
node = parent
parent = node.parent
if parent == None:
node = self.last
parent = node.parent
node.parent = None
if parent != None:
parent.left = None
self.last = self.mostRight(self.head)
else:
newLast = self.mostRight(parent.left)
node = self.last
parent = node.parent
node.parent = None
if parent.left == node:
parent.left = None
else:
parent.right = None
self.last = newLast
self.size -= 1
return node
def minHeapComparator(a, b):
if a <= b:
return False
if a > b:
return True
def maxHeapComparator(a, b):
if a >= b:
return False
else:
return True
class MedianHolder:
def __init__(self):
self.minHeap = MyHeap(minHeapComparator)
self.maxHeap = MyHeap(maxHeapComparator)
def addNum(self, num):
if self.maxHeap.isEmpty():
self.maxHeap.add(num)
return
if self.maxHeap.getHead() >= num:
self.maxHeap.add(num)
else:
if self.minHeap.isEmpty():
self.minHeap.add(num)
elif self.minHeap.getHead() > num:
self.maxHeap.add(num)
else:
self.minHeap.add(num)
self.modifyTwoHeapSize()
def modifyTwoHeapSize(self):
if self.minHeap.getSize() == self.maxHeap.getSize() + 2:
self.maxHeap.add(self.minHeap.popHead())
if self.maxHeap.getSize() == self.minHeap.getSize() + 2:
self.minHeap.add(self.maxHeap.popHead())
def getMedian(self):
maxHeapSize = self.maxHeap.getSi***HeapSize = self.minHeap.getSize()
if maxHeapSi***HeapSize == 0:
return None
if (maxHeapSi***HeapSize) & 1 == 0:
return (self.maxHeap.getHead() + self.minHeap.getHead()) / 2
else:
if maxHeapSize > minHeapSize:
return self.maxHeap.getHead()
else:
return self.minHeap.getHead()
#
# the medians
# @param operations int整型二维数组 ops
# @return double浮点型一维数组
#
class Solution:
def flowmedian(self , operations ):
ans=[]
s=MedianHolder()
for i in operations:
if i[0]==1:
s.addNum(i[1])
elif i[0]==2:
if s.getMedian():
ans.append(s.getMedian())
else:
ans.append(-1)
return ans啊有参考答案:用例通过率: 100.00% 运行时间: 110ms 占用内存: 11976KB
class Solution {
public:
/**
* the medians
* @param operations int整型vector<vector<> ops
* @return double浮点型vector
*/
vector<double> flowmedian(vector<vector<int>> & operations) {
// write code here
vector<double> res;
for(auto ops: operations){
if(ops[0] == 1){
put(ops[1]);
}else{
res.push_back(get());
}
}
return res;
}
multiset<int> nums;
multiset<int>::iterator it = nums.end();
void put(int x){
int n = nums.size();
nums.insert(x);
if(n==0){
it = nums.begin();
}else{
if(n&1){
it = x < *it ? it : ++it;
}else{
it = x < *it ? --it: it;
}
}
}
double get(){
if(nums.size() == 0){
return -1;
}
return (*it + *prev(it, 1 - (nums.size()&1)))*0.5;
}
};


京公网安备 11010502036488号