leetcode 895 Maximum Frequency Stack
让stack中pop出重复数量最大且最靠近顶端的元素。 很自然的数据结构不能有效解决。
求push和pop操作都为o(1)的方法!!!(忽略map操作时间)
空间换时间。
要在pop一个最大后保留顺序信息,那就决定着空间复杂度是n,怎么组织这个stack呢,一维还是二维。if you choose two dimensions, nature way is to keep same value in same single array, but in the solution below the same values must be in different array , so the most frequent num can stand out.
首先一维不行,尝试记录上一个相同元素出现位置,然后记录各个head,那么取最大的时候必须要从head中比较出最大,在每个元素都不同时,n的时间复杂度去找最大,显然不行。在输入数据是20000的时候,只能在时限内处理10分之1的数据。
i
class FreqStack:
def __init__(self):
self.heads={}
self.nodes=[[]]
def push(self, x):
if x not in self.heads:
self.heads[x]=1
else:
self.heads[x]+=1
if self.heads[x]>=len(self.nodes):
self.nodes.append([x])
else:
self.nodes[self.heads[x]].append(x)
def pop(self):
ans=self.nodes[-1][-1]
self.nodes[-1].pop()
if len(self.nodes[-1])==0:
self.nodes.pop()
self.heads[ans]-=1
return ans