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
posted @ 2018-09-06 15:19  Cloud.9  阅读(215)  评论(0编辑  收藏  举报