• 146. LRU Cache ( Least Recently Used)


    import kotlin.collections.HashMap
    
    /**
     * 146. LRU Cache
     * https://leetcode.com/problems/lru-cache/description/
     *
     * 我们需要设计:
     * 1:使用HashMap:用于存储现有的key,value就是指向双向链表的节点
     * 2:双向链表:在移除尾部元素、添加元素到头部、移动元素到头部都可以在O(1)完成
    *
    */ class Node(key: Int, value: Int) { var key = 0 var value = 0 var next: Node? = null var prev: Node? = null init { this.key = key this.value = value } } class LRUCache(capacity: Int) { var head: Node? = null var tail: Node? = null var capacity = 0 val map = HashMap<Int, Node>(capacity) init { this.capacity = capacity } fun get(key: Int): Int { val n = map.get(key) if (n == null) { return -1 } removeNode(n) //add node to tail addNode(n) return n.value } fun put(key: Int, value: Int) { if (map.containsKey(key)) { val node = map.get(key) node?.value = value removeNode(node!!) addNode(node) } else { if (map.size >= capacity) { if (head != null) { map.remove(head?.key)//delete head here, because i add new node at the tail removeNode(head!!) } } val newNode = Node(key, value) addNode(newNode) map.put(key, newNode) } } private fun removeNode(node: Node) { if (node.prev != null) { node.prev?.next = node.next } else { head = node.next } if (node.next != null) { node.next?.prev = node.prev } else { tail = node.prev } } private fun addNode(node: Node) { if (tail != null) { tail?.next = node } node.prev = tail node.next = null tail = node if (head == null) { head = tail } } } /** * Your LRUCache object will be instantiated and called as such: * var obj = LRUCache(capacity) * var param_1 = obj.get(key) * obj.put(key,value) */
  • 相关阅读:
    bash组织成树数据结构
    statickeyword于C和C++用法
    POJ2239 Selecting Courses【二部图最大匹配】
    MVC过滤器的详细讲解和示范样本
    hdoj 2602 Bone Collector 【01背包】
    下的生产环境was重新启动不同意,怎么做?
    Qt Model/View 的简单说明
    View与Model绑定注意事项 (视图无数据显示)
    Qt Delgate的使用 简单说明
    QAbstractTableModel中的data()到底执行几遍???
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/12383568.html
Copyright © 2020-2023  润新知