当前位置: 首页 > news >正文

网站建设印花税建设厅网站查询资质

网站建设印花税,建设厅网站查询资质,上海app开发和制作公司,好的设计logo网站题目链接 Leetcode.146 LRU 缓存 mid 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 c a p a c i t y capacity capacity 初始化 LRU 缓存int get(int key) 如果关键…

题目链接

Leetcode.146 LRU 缓存 mid

题目描述

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 c a p a c i t y capacity capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 k e y key key 存在于缓存中,则返回关键字的值,否则返回 − 1 -1 1
  • void put(int key, int value) 如果关键字 k e y key key 已经存在,则变更其数据值 v a l u e value value ;如果不存在,则向缓存中插入该组 k e y − v a l u e key-value keyvalue 。如果插入操作导致关键字数量超过 c a p a c i t y capacity capacity ,则应该 逐出 最久未使用的关键字。

函数 g e t get get p u t put put 必须以 O ( 1 ) O(1) O(1) 的平均时间复杂度运行。

示例:

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释 LRUCache lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是
{1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get(1); // 返回
1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到) lRUCache.put(4, 4); // 该操作会使得关键字 1
作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get(3);
// 返回 3 lRUCache.get(4); // 返回 4

提示:
  • 1 ≤ c a p a c i t y ≤ 3000 1 \leq capacity \leq 3000 1capacity3000
  • 0 ≤ k e y ≤ 10000 0 \leq key \leq 10000 0key10000
  • 0 ≤ v a l u e ≤ 1 0 5 0 \leq value \leq 10^5 0value105
  • 最多调用 2 ∗ 1 0 5 2 * 10^5 2105 g e t get get p u t put put

解法:双向链表 + 哈希表

我们先设计出双向链表的节点 Node

struct Node{Node* prev;Node* next;int key;int val;Node(int k,int v){key = k;val = v;prev = nullptr;next = nullptr;}
};

我们开始设计链表的 API。

struct LinkedList{Node* head; //链表头节点(假)Node* tail; //链表尾节点(假)unordered_map<int,Node*> mp; //根据键值 key 获得对应的节点 nodeint size; //节点数量 , 初始为0int capacity; //链表容量,即链表最多能由几个节点,多了的节点就移除
};    

每次我们通过 g e t get get p u t put put 操作节点之后,我们就要将其移动到链表头部,所以我们需要一个节点 node 插入到链表头部的函数 add

void add(Node* node){head->next->prev = node;node->next = head->next;head->next = node;node->prev = head;
}

此外,我们需要从链表中删除指定节点 node

void remove(Node* node){node->prev->next = node->next;node->next->prev = node->prev;
}

当链表中的节点数量 s i z e size size 超过链表容量 c a p a c i t y capacity capacity 时 ,即 s i z e > c a p a c i t y size > capacity size>capacity。我们就需要移除尾部的节点 并且 从 m p mp mp 删除对应的 k e y key key n o d e node node 的关系:

void remove(){Node* node = tail->prev; //要删除的是尾部的节点remove(node);int key = node->key;mp.erase(key);size--; //移除节点,链表节点数量 - 1
}

对于 g e t get get,如果不存在 k e y key key 对应的节点,直接返回 − 1 -1 1;如果存在 ,返回对应节点 n o d e node node 的值,并且将 n o d e node node 提升到链表头部:

int get(int key){if(!mp.count(key)) return -1;Node* node = mp[key];int ans = node->val;//如果此时 node 已经是第一个节点了,就没必要移动了,直接返回node->valif(node == head->next) return ans;//将 node 移动到链表头部remove(node);add(node);return ans;
}

对于 p u t put put,如果存在 k e y key key 对应的节点,我们更新节点值,然后将节点移动到头部即可;如果不存在,那我们直接插入新的节点 N o d e ( k e y , v a l u e ) Node(key,value) Node(key,value),如果此时超出容量,还要移除尾部的节点:

void put(int key,int value){if(mp.count(key)){Node* node = mp[key];node->val = value;if(node == head->next) return;remove(node);add(node);return;}Node* node = new Node(key,value);mp[key] = node;add(node);size++;if(size > capacity) remove();
}

时间复杂度: O ( 1 ) O(1) O(1)

完整代码:

struct Node{Node* prev;Node* next;int key;int val;Node(int k,int v){key = k;val = v;prev = nullptr;next = nullptr;}
};struct LinkedList{Node* head;Node* tail;unordered_map<int,Node*> mp;int size;int capacity;LinkedList(int c){head = new Node(-1,-1);tail = new Node(-1,-1);head->next = tail;tail->prev = head;size = 0;capacity = c;}void put(int key,int value){if(mp.count(key)){Node* node = mp[key];node->val = value;if(node == head->next) return;remove(node);add(node);return;}Node* node = new Node(key,value);mp[key] = node;add(node);size++;if(size > capacity) remove();}int get(int key){if(!mp.count(key)) return -1;Node* node = mp[key];int ans = node->val;if(node == head->next) return ans;remove(node);add(node);return ans;}void add(Node* node){head->next->prev = node;node->next = head->next;head->next = node;node->prev = head;}void remove(){Node* node = tail->prev;remove(node);int key = node->key;mp.erase(key);size--;}void remove(Node* node){node->prev->next = node->next;node->next->prev = node->prev;}
};class LRUCache {
public:LinkedList* list;LRUCache(int capacity) {list = new LinkedList(capacity);}int get(int key) {return list->get(key);}void put(int key, int value) {list->put(key,value);}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/
http://www.yayakq.cn/news/918527/

相关文章:

  • 商业网站的网址vi手册免费模板
  • 江苏省交通建设局网站首页高端网站建设案例
  • 律师做网络推广哪个网站好安心保险官方网站
  • 营销网站结构黑龙江公司网站建设
  • 杭州网站建设交易百度智能创作平台
  • 网站建设哪家公司好一点wordpress 信息输入框
  • 一个专门做熊的网站云盘可以做网站吗
  • jsp获取网站域名自媒体平台app
  • 网站开发中的著作权归属如何提高网站seo排名
  • 一个公司的网站怎么做外贸网站建设定制开发
  • 网络广告网站品牌宣传如何做
  • 云南网站设计公司重庆网站建设制作费用
  • 固安企业网站建设wordpress搞笑
  • wordpress模板页面说明网站关键词在线优化
  • php网站开发技术代码2021最近比较火的营销事件
  • 教务在线网站开发报告书编程入门教学
  • 自己做网站升seowordpress前大
  • 男生做污污事的视频网站wordpress 正在维护
  • 中国纪检监察报总编如何做好网站推广优化
  • 重庆专业做网站公司上海网站建设的价格是多少钱
  • dz网站模板 首页显示内容wordpress上传数据
  • 注册网站不需要手机验证的ppt模板免费下载简约
  • 重庆网站建设 公司廊坊企业自助建站
  • 专业做网站的公司 郑州最好看的2019中文大全电影
  • 天宫山缆车多少钱seo优化的技巧
  • 烟台高端品牌网站建设长沙做黄叶和网站的公司有哪些
  • 网站优化常见的优化技术网站是哪家公司做的
  • 好看网站推荐货源台州网站设计建设
  • 深圳龙华区住房和建设局网站西安网站制作开发
  • 陕西省中小学教师培训网站做外国网站百度搜到