力扣LFU460
好难的460
比146还难。看了两遍视频解答,看懂一点点。而且一些大厂好像还喜欢面试问!
# problemkey 就是跟LRU不一样的是,LRU去掉最久没用的,LFU去掉用频率最小的
class Node:def __init__(self, key, val, pre=None, nex=None, freq=0):self.pre = preself.nex = nexself.freq = freqself.val = valself.key = keydef insert(self, nex):nex.pre = selfnex.nex = self.nexself.nex.pre = nexself.nex = nexdef create_linked_list():head = Node(float('inf'), float('inf'))tail = Node(float('inf'), float('inf'))head.nex = tailtail.pre = headreturn (head, tail)class LFUCache_LC:def __init__(self, capacity: int):self.capacity = capacityself.size = 0self.minFreq = 0self.freqMap = collections.defaultdict(create_linked_list)self.keyMap = {}# 把node删掉,可能是因为淘汰了,也可能是频率增加要换位置def delete(self, node):if node.pre:node.pre.nex = node.nexnode.nex.pre = node.preif node.pre is self.freqMap[node.freq][0] and node.nex is self.freqMap[node.freq][-1]:self.freqMap.pop(node.freq)return node.key# freq 加一个,get一次就得加一次频率def increase(self, node):node.freq += 1self.delete(node)self.freqMap[node.freq][-1].pre.insert(node)if node.freq == 1:self.minFreq = 1elif self.minFreq == node.freq - 1:head, tail = self.freqMap[node.freq - 1]if head.nex is tail:self.minFreq = node.freqdef get(self, key: int) -> int:if key in self.keyMap:self.increase(self.keyMap[key])return self.keyMap[key].valreturn -1def put(self, key: int, value: int) -> None:if self.capacity != 0: # 这个东西都不变啊,就是一开始设置0的话,不用putif key in self.keyMap:node = self.keyMap[key]node.val = valueelse:node = Node(key, value)self.keyMap[key] = nodeself.size += 1if self.size > self.capacity:self.size -= 1deleted = self.delete(self.freqMap[self.minFreq][0].nex)self.keyMap.pop(deleted)self.increase(node)