トピック:
デザインは、最低使用の項目を削除します「最低使用」キャッシュを構築し。初期化の最大容量を指定します(キーはあなたが挿入すると、特定の対応する値を取得することができます)、キーの値からキャッシュにマッピングする必要があります。キャッシュがいっぱいになると、それは、最低使用の項目を削除する必要があります。
これは、次の機能をサポートする必要があります。データの取得 get
および書き込みデータを put
。
データ収集 get(key)
-キー(キー)がキャッシュに存在する場合、そのキーの値を取得する(常に正)、そうでない場合は-1。
データの書き込み put(key, value)
-キーが存在しない場合は、データ値が書き込まれます。キャッシュ容量の上限に達すると、それは新しいデータ値のための部屋を作るために新しいデータを書き込む前に、最低使用データ値を削除する必要があります。
例:
LRUCacheキャッシュ=新しいLRUCache(2 / * バッファサイズ* /); cache.put(1 ,. 1); cache.put(2、2); cache.get(1); //戻り1 。cache.put(3、 3); //この操作は、キー2無効になります cache.get(2); // -1を返します(見つからない) 。cache.putを(4 ,. 4); //この操作は無効なキーの原因になります キャッシュを。 (1)を得る; //戻り-1(見つかりません) cache.get(3); //戻り3。 cache.get(4); //戻り4
分析:
LeetCode 146 LRU CacheLRUキャッシング機構(C ++ / Java)のこの説明を参照。
手順:
クラスLRUCache { LRUCache(int型の容量){ この .capacity = 容量。 この .MAP = 新しい HashMapの<> (); この .dummyHead = 新しいノード(0,0 )。 この .tail = 新しいノード(0,0 )。 dummyHead.prev = nullを。 dummyHead.next = 尾。 tail.prev = dummyHead。 tail.next = nullを。 } int型のget(int型のキー){ 場合(map.containsKey(キー)){ ノードノード = map.get(キー)。 int型の値= node.val。 がremoveNode(ノード)。 addToHead(ノード)。 戻り値; } 戻り -1 。 } ボイド PUT(INTキー、INT 値){ 場合(map.containsKey(キー)){ ノードノード = map.get(キー)。 がremoveNode(ノード)。 map.remove(キー); サイズ - ; } ノードノード = 新しいノード(キー、値)。 map.put(キー、ノード)。 もし(サイズ< 容量){ addToHead(ノード)。 サイズ ++ ; } 他{ map.remove(tail.prev.key)。 がremoveNode(tail.prev)。 addToHead(ノード)。 } } プライベート ボイドがremoveNode(ノードノード){ node.prev.next = node.next。 node.next.prev = node.prev。 } プライベート のボイドaddToHead(ノードノード){ node.next = dummyHead.next。 node.next.prev = ノード。 dummyHead.next = ノード。 node.prev = dummyHead。 } クラスノード{ int型のキー。 int型のval; ノードの前; 次のノード; パブリックノード(int型のキー、INT ヴァル){ この .KEY = キー。 この .val = valの; } } プライベートのHashMap <整数、ノード> マップ。 プライベート int型の容量; プライベートノードdummyHead。 プライベートノード尾。 プライベート int型のサイズ。 } / ** *あなたのLRUCacheオブジェクトがインスタンス化され、などと呼ばれます: * LRUCache OBJ =新しいLRUCache(容量); * int型PARAM_1 = obj.get(キー); * obj.put(キー、値); * /
クラスLRUCache { LRUCache(int型の容量){ この .capacity = 容量。 マップ = 新しいのLinkedHashMap <> (); } INT GET(int型のキー){ 場合(map.containsKey(キー)){ int型値= map.get(キー)。 map.remove(キー); map.put(キー、値)。 戻り値; } 戻り -1 。 } ボイド PUT(INTキー、int型の値){ もし(map.containsKey(キー)){ map.remove(キー)。 } map.put(キー、値)。 もし(map.size()> 容量){ map.remove(map.keySet()イテレータ()次の()); } } プライベート int型の容量; 民間のLinkedHashMap <整数、整数> マップ。 } / ** *あなたのLRUCacheオブジェクトがインスタンス化され、などと呼ばれます: * LRUCache OBJ =新しいLRUCache(容量); * int型PARAM_1 = obj.get(キー); * obj.put(キー、値); * /