参考
题目来源:leetcode,labuladong
功能
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
- FreqStack() 构造一个空的堆栈。
- void push(int val) 将一个整数 val 压入栈顶。
- int pop() 删除并返回堆栈中出现频率最高的元素。
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。
思路
- 因要弹出出现频率最大的一个数,则需要一个字典存储数-数出现的频率,记为VF表,为方便弹出最大频率的数,需要将最大频率记录下来。
- 当出现相同最高频率的数,则移除并返回最接近栈顶的元素,则需要一个字典来存储频率-出现该频率的值(用列表来表示),记为FV表。
代码
class FreqStack:
def __init__(self):
self.freq = {} #VF,值-频率,每个值对应一个频率
self.group = {} #FV,频率-值(用一个列表来存),一个频率对应多个值
self.maxfreq = 0 #存最大频率
def push(self, val: int) -> None:
#更新VF
#如果该值存在,则频率加一, 否则为1
if val in self.freq:
self.freq[val] += 1
else:
self.freq[val] = 1
#更新最大频率
if self.freq[val] > self.maxfreq:
self.maxfreq = self.freq[val]
#更新FV
#如果该频率在字典里面,则往里面添加,否则新创建键-列表
if self.freq[val] in self.group:
self.group[self.freq[val]].append(val)
else:
self.group[self.freq[val]] =[val]
def pop(self) -> int:
#删除频率最大的那个数,然后那个数的频率减一
try: #防止集合里面没有数了,返回-1
x = self.group[self.maxfreq].pop()
self.freq[x] -= 1
except:
return -1
#如果最大频率中没有数了,最大频率减一
if not self.group[self.maxfreq]:
self.maxfreq -= 1
return x
fs = FreqStack()
print(fs.push(5)) #None [5]
print(fs.push(7)) #None [5,7]
print(fs.push(5)) #None [5,7,5]
print(fs.push(7)) #None [5,7,5,7]
print(fs.push(4)) #None [5,7,5,7,4]
print(fs.push(5)) #None [5,7,5,7,4,5]
print(fs.pop()) #5 [5,7,5,7,4]
print(fs.pop()) #7 [5,7,5,4]
print(fs.pop()) #4 [5,7,5]