赞
踩
要求:请你设计并实现一个满足 LRU (Least Recently Used 最近最少使用) 缓存 约束的数据结构。
函数 get 和put 必须以 O(1) 的平均时间复杂度运行。
思路:采用 字典 + 双向链表
图解:
swift:
public class Solution { class Node { //需要存储key 移除key-value需要 key var key: Int var value: Int var left: Node? var right: Node? init(key :Int=0, value: Int=0, left: Node?=nil, right: Node?=nil) { self.key = key self.value = value self.left = left self.right = right } } private var dic = Dictionary<Int, Node>.init() private var capacity = 0 private var headNode = Node.init(key: -1, value: -1, left: nil, right: nil) private var tailNode = Node.init(key: -1, value: -1, left: nil, right: nil) init(_ capacity: Int) { self.capacity = capacity self.headNode.right = self.tailNode self.tailNode.left = self.headNode } func get(_ key: Int) -> Int { if !self.dic.keys.contains(key){ return -1 }else{ self.swapNode(self.dic[key]!) return self.dic[key]!.value } } func set(_ key: Int, _ value: Int) { if !self.dic.keys.contains(key){ let node = Node.init(key: key, value: value, left: nil, right: nil) if self.dic.count < self.capacity { self.addNodeToFirst(node) self.dic.updateValue(node, forKey: key) }else{ self.addNodeToFirst(node) self.dic.updateValue(node, forKey: key) //移除最久未使用(重要) self.dic.removeValue(forKey: self.tailNode.left!.key) self.removeNode(self.tailNode.left!) } }else{ let node = self.dic[key]! node.value = value self.swapNode(node) } } private func swapNode(_ node: Node) { if node.left!.value != -1{ //移除先前节点 self.removeNode(node) //插入节点 self.addNodeToFirst(node) } } private func addNodeToFirst(_ node: Node) { node.right = self.headNode.right self.headNode.right!.left = node self.headNode.right = node node.left = self.headNode } private func removeNode(_ node: Node) { node.left!.right = node.right node.right!.left = node.left } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。