LRU Cache | leetcode

LRU Cache

 

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.


#include 
   
   
    
    
using namespace std;
#include 
    
    
     
     
#include 
     
     
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              class LRUCache { public: struct Node { int key; int value; Node( int k, int v): key( k), value( v) { } }; public: // LRU是Least Recently Used的缩写,即最少使用页面置换算法,链表操作(仍然超时) // 加入hashmap去判断是否存在(key, list 
             
               ::iterator) 560ms //所有耗时操作全部在查找,所以用hash // 链表和数组全部超时。。O(n2),而且在Get之中没有更新操作代码舍弃。。 LRUCache(int capacity) { cache.clear(); exist.clear(); this->capacity = capacity; } int get(int key) { unordered_map 
              
                ::iterator >::iterator iter = exist.find(key); if (iter == exist.end()) { return -1; } else { //同样要更新数据!!! int value = (iter->second)->value; cache.erase(iter->second); exist.erase( key); //同样需要删除,因为后来指针改变了 cache.insert(cache.begin(), Node( key, value)); exist[ key] = cache.begin(); //添加首元素 return value; } } void set(int key, int value) { unordered_map 
               
                 ::iterator >::iterator iter = exist.find(key); if (iter == exist.end()) { if (cache.size() == capacity) { //已经满了,需要删除 list< Node>:: iterator tmp_iter = --cache.end(); int tmp_key = tmp_iter->key; cache.erase(tmp_iter); exist.erase(tmp_key); } cache.insert(cache.begin(), Node( key, value)); exist[ key] = cache.begin(); //添加首元素 } else { //更新顺序 cache.erase(iter->second); exist.erase( key); //同样需要删除,因为后来指针改变了 cache.insert(cache.begin(), Node( key, value)); exist[ key] = cache.begin(); //添加首元素 } //Print(); } void Print() { for ( list< Node>:: iterator iter = cache.begin(); iter != cache.end(); ++iter) { cout << iter->key << " "; } cout << endl; } private: list 
                
                  cache; unordered_map< int, list< Node>:: iterator> exist; int capacity; }; int main() { //2,[set(2,1),set(1,1),get(2),set(4,1),get(1),get(2)] //[1,-1,1] int arr[] = {2, 1, 1, 1, 4, 1}; LRUCache so(2); int i = 0; so.set(arr[i * 2], arr[i * 2 + 1]); i = 1; so.set(arr[i * 2], arr[i * 2 + 1]); cout << so.get(2) << endl; i = 2; so.set(arr[i * 2], arr[i * 2 + 1]); cout << so.get(1) << endl; cout << so.get(2) << endl; //cout << so.get(4) << endl; //cout << so.get(10) << endl; return 0; } 
                 
                
               
              
             
            
           
          
         
       
      
      
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值