力扣LFU460

好难的460

比146还难。看了两遍视频解答,看懂一点点。而且一些大厂好像还喜欢面试问!

python 复制代码
# problemkey 就是跟LRU不一样的是,LRU去掉最久没用的,LFU去掉用频率最小的
class Node:
    def __init__(self, key, val, pre=None, nex=None, freq=0):
        self.pre = pre
        self.nex = nex
        self.freq = freq
        self.val = val
        self.key = key

    def insert(self, nex):
        nex.pre = self
        nex.nex = self.nex
        self.nex.pre = nex
        self.nex = nex


def create_linked_list():
    head = Node(float('inf'), float('inf'))
    tail = Node(float('inf'), float('inf'))
    head.nex = tail
    tail.pre = head
    return (head, tail)


class LFUCache_LC:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.size = 0
        self.minFreq = 0
        self.freqMap = collections.defaultdict(create_linked_list)
        self.keyMap = {}

    # 把node删掉,可能是因为淘汰了,也可能是频率增加要换位置
    def delete(self, node):
        if node.pre:
            node.pre.nex = node.nex
            node.nex.pre = node.pre
            if 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 += 1
        self.delete(node)
        self.freqMap[node.freq][-1].pre.insert(node)
        if node.freq == 1:
            self.minFreq = 1
        elif self.minFreq == node.freq - 1:
            head, tail = self.freqMap[node.freq - 1]
            if head.nex is tail:
                self.minFreq = node.freq

    def get(self, key: int) -> int:
        if key in self.keyMap:
            self.increase(self.keyMap[key])
            return self.keyMap[key].val
        return -1

    def put(self, key: int, value: int) -> None:
        if self.capacity != 0: # 这个东西都不变啊,就是一开始设置0的话,不用put
            if key in self.keyMap:
                node = self.keyMap[key]
                node.val = value
            else:
                node = Node(key, value)
                self.keyMap[key] = node
                self.size += 1
            if self.size > self.capacity:
                self.size -= 1
                deleted = self.delete(self.freqMap[self.minFreq][0].nex)
                self.keyMap.pop(deleted)
            self.increase(node)
相关推荐
深度学习lover14 分钟前
<数据集>yolo煤矿安全帽识别数据集<目标检测>
人工智能·python·深度学习·yolo·目标检测·计算机视觉·煤矿安全帽识别
程序员爱钓鱼20 分钟前
Python编程实战 · 基础入门篇 | 字典(dict)
后端·python·ipython
程序员爱钓鱼23 分钟前
Python编程实战 · 基础入门篇 | 集合(set)
后端·python·ipython
B站_计算机毕业设计之家1 小时前
计算机视觉:python车牌识别检测系统 YOLOv8 深度学习pytorch技术 LPRNet车牌识别算法 CCPD2020数据集 ✅
大数据·python·深度学习·机器学习·计算机视觉·数据分析·车牌识别
这个世界的真神1 小时前
【每日算法】 洛谷 P12341 【[蓝桥杯 2025 省 A/Python B 第二场] 消消乐】 2025.10.26
python·算法·蓝桥杯
l1t1 小时前
利用DeepSeek改写递归CTE SQL语句为Python程序及优化
数据库·人工智能·python·sql·算法·性能优化·deepseek
寄思~2 小时前
python批量读取word表格写入excel固定位置
开发语言·python·excel
人间乄惊鸿客3 小时前
python — day9
开发语言·python
im_AMBER7 小时前
Leetcode 38
笔记·学习·算法·leetcode
SteveRocket7 小时前
Python机器学习与数据分析教程之pandas
python·机器学习·数据分析