每日两题 / 142. 环形链表 II 146. LRU 缓存(LeetCode热题100)

news/2024/10/22 2:43:20/

142. 环形链表 II - 力扣(LeetCode)
image.png

用哈希记录走过的节点即可

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *cur = head;set<ListNode*> s;while (cur) {if (s.count(cur)) {return cur;}s.insert(cur);cur = cur->next;}return nullptr;}
};

146. LRU 缓存 - 力扣(LeetCode)
O ( 1 ) O(1) O(1)地查找并修改kv结构,用unordered_map即可解决
问题是题目要求:哈希表容量有限,超出容量时,将删除最久未访问的kv
那么关键就在于:如何用数据结构表示访问的先后顺序?显然哈希表无法做到
越靠近链表的头指针,越经常访问该元素。为何不用数组?越靠近首元素/尾元素,越经常访问该元素?维护访问顺序时,对于数组,需要 O ( n ) O(n) O(n)地移动数组中的元素
对于链表,只需要 O ( 1 ) O(1) O(1)地修改节点,显然链表在时间上更优且满足题意

对于最近访问的元素,若不在链表中,则创建新节点并插入链表头(添加),若在链表中,则将其移动到链表头(删除+增加)。综上,我们的链表需要(增加+删除)这两个操作,显然使用双向链表更优
最后的问题是:在链表中如何 O ( 1 ) O(1) O(1)地查找某个元素?显然链表无法作用,所以使用哈希表作为辅助结构,存储key值与其在链表中的位置(节点地址)

struct Node {int val, key;Node *prev = nullptr;Node *next = nullptr;
};class LRUCache {public:Node *head;Node *tail;unordered_map<int, Node*> mp;int capacity;void addToHead(Node *node) {Node *first = head->next;head->next = node, first->prev = node;node->next = first, node->prev = head;}void delNode(Node *node) {Node *prev = node->prev;Node *next = node->next;prev->next = next;next->prev = prev;}LRUCache(int capacity) {head = new Node;tail = new Node;head->next = tail, head->prev = tail;tail->next = head, tail->prev = head;this->capacity = capacity;}int get(int key) {if (mp.count(key)) {delNode(mp[key]);addToHead(mp[key]);return mp[key]->val;}return -1;}void put(int key, int value) {if (mp.count(key)) {mp[key]->val = value;delNode(mp[key]);addToHead(mp[key]);}else {mp[key] = new Node;mp[key]->val = value, mp[key]->key = key;addToHead(mp[key]);}if (mp.size() > capacity) {Node *Del = tail->prev;mp.erase(Del->key);delNode(Del);delete Del;}}
};/*** 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.ppmy.cn/news/1423280.html

相关文章

React搭建一个文章后台管理系统

1、项目准备 本篇文章讲解的是一个简单的文章后台管理系统&#xff0c;系统的功能很简单&#xff0c;如下&#xff1a;登录、退出&#xff1b;首页&#xff1b;内容(文章)管理&#xff1a;文章列表、发布文章、修改文章。 1&#xff09;React官方脚手架&#xff1a;create-rea…

设计模式:备忘录模式

定义 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不暴露对象实现细节的前提下&#xff0c;捕获和外部化对象的内部状态&#xff0c;以便在将来某个时刻可以将该对象恢复到此状态。备忘录模式使用三个类类型来实现&#xff1a;发…

Flowable工作流引擎:Spring Boot集成指南

Flowable工作流引擎&#xff1a;Spring Boot集成指南 前言开始集成相关配置文件pom文件 前言 在快速变化的软件开发世界中&#xff0c;工作流管理成为了企业应用不可或缺的组成部分。无论是简化复杂业务流程、提升操作效率还是确保流程的一致性和透明性&#xff0c;一个强大的…

前端网络---http协议演变

http协议的演变 什么是http协议&#xff1f; HTTP 协议全称为 Hypertext Transfer Protocol&#xff0c;即超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络传输协议 http协议演变 1991年0.9版本-------1996年1.0版本-------1997年1.1版本--------2015年2版本-…

走 https 和不走 https 对前端有什么影响

走 https 和不走 https 对前端有什么影响 之前网站走的是 https &#xff0c;自从域名那边改成需要三个月就要更新之后就没有再用 https&#xff0c;现在都是走的 http&#xff0c;使用中遇到了几个比较明显的功能限制。 最直接的影响就是不能使用 ServiceWorker 了&#xff…

简述Kafka的高可靠性

什么叫可靠性&#xff1f; 大家都知道&#xff0c;系统架构有三高&#xff1a;「高性能、高并发和高可用」&#xff0c;三者的重要性不言而喻。 对于任意系统&#xff0c;想要同时满足三高都是一件非常困难的事情&#xff0c;大型业务系统或者传统中间件都会搭建复杂的架构来…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

IDEA远程调试debug

IDEA远程调试debug jar包启动脚本配置IDEA配置 通俗的说&#xff1a;本地有代码&#xff0c;服务器项目出现问题&#xff0c;环境的中间件配置不同&#xff0c;用idea远程调试&#xff0c;能快速定位问题&#xff0c;解决问题。 jar包启动脚本配置 jdk5-8写法 java -Xdebug -…