【力扣hot100題】(034)LRU緩存

做完這題已經沒有任何力氣寫鏈表題了。

思路很簡單,就是調試特別的痛苦。

老是頻頻報錯,唉。

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value) : key(key), val(value), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head=new ListNode();ListNode* tail=head;int capacity;map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;}int get(int key) {if(hash.find(key)!=hash.end()){if(head->next==hash[key]) return hash[key]->val;hash[key]->prev->next=hash[key]->next;if(hash[key]->next) hash[key]->next->prev=hash[key]->prev;if(hash[key]==tail) tail=hash[key]->prev;hash[key]->next=head->next;if(head->next) head->next->prev=hash[key];hash[key]->prev=head;head->next=hash[key];return hash[key]->val;}else return -1;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;get(key);return;}else if(capacity==0){hash.erase(tail->key);tail=tail->prev;tail->next=nullptr;}else capacity--;ListNode* newhead=new ListNode(key,value,head->next,head);if(tail==head) tail=newhead;if(head->next) head->next->prev=newhead;head->next=newhead;hash[key]=newhead;}
};/*** 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);*/

看了答案,其實有更好的做法,可以優化并且降低代碼的復雜度,感覺我寫代碼還是太畏縮了。

優化方案一:將頭指針和尾指針都設成虛擬指針,一個指向雙向鏈表頭部的前一個位置,一個指向尾部的后一個位置。(我寫的時候為了節省空間復雜度只弄了一個頭虛擬指針,還是太不敢了)

優化方案二:構造更多的函數,這樣就可以直接調用,代碼邏輯會清晰很多。

于是按這個改進思路又寫了一遍,果然簡單多了……

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head;ListNode* tail;int capacity;unordered_map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;head=new ListNode();tail=new ListNode(0,0,nullptr,head);head->next=tail;}int get(int key) {if(hash.find(key)==hash.end()) return -1;erase(hash[key]);insert(hash[key]);return hash[key]->val;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;erase(hash[key]);insert(hash[key]);return ;}if(capacity>0) capacity--;else if(capacity==0){hash.erase(tail->prev->key);erase(tail->prev);}ListNode* newnode=new ListNode(key,value,nullptr,nullptr);insert(newnode);hash[key]=newnode;}void erase(ListNode* node){node->prev->next=node->next;node->next->prev=node->prev;}void insert(ListNode* node){head->next->prev=node;node->next=head->next;node->prev=head;head->next=node;}
};/*** 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.pswp.cn/bicheng/75409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75409.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于隨機森林算法的信用風險評估項目

引言 這是一個基于隨機森林算法的德國信用風險評估項目&#xff0c;主要目的是構建一個機器學習模型來評估德國客戶的信用風險&#xff0c;判斷客戶是否為高風險客戶。 # -*- coding: utf-8 -*- """ 德國信用風險評估隨機森林模型 """ # 基礎…

亞馬遜云科技攜手 DeepSeek:開啟企業級生成式 AI 新征程

文章目錄 一、DeepSeek-R1模型的技術突破&#xff08;一&#xff09;卓越的性能表現&#xff08;二&#xff09;獨特的訓練方法&#xff08;三&#xff09;豐富的模型生態 二、亞馬遜云科技平臺上的部署與優化&#xff08;一&#xff09;靈活的部署方式&#xff08;二&#xff…

Windows 實戰-evtx 文件分析--筆記

Windows 取證之EVTX日志 - 蟻景網安實驗室 - 博客園 一.evtx日志文件是什么 從 Windows NT 6.0&#xff08;也就是 Windows Vista 和 Windows Server 2008&#xff09;開始&#xff0c;微軟引入了一種全新的日志文件格式&#xff0c;稱為 evtx。這種格式取代了之前 Windows 系…

LangChain/Eliza框架在使用場景上的異同,Eliza通過配置實現功能擴展的例子

LangChain與Eliza框架的異同分析 ?一、相同點? ?模塊化架構設計? 兩者均采用模塊化設計&#xff0c;支持靈活擴展和功能組合。LangChain通過Chains、Agents等組件實現多步驟任務編排?&#xff0c;Eliza通過插件系統和信任引擎實現智能體功能的動態擴展?。模塊化特性降低…

英語口語 -- 常用 1368 詞匯

英語口語 -- 常用 1368 詞匯 介紹常用單詞List1 &#xff08;96 個&#xff09;時間類氣候類自然類植物類動物類昆蟲類其他生物地點類 List2 &#xff08;95 個&#xff09;機構類聲音類食品類餐飲類蔬菜類水果類食材類飲料類營養類疾病類房屋類家具類服裝類首飾類化妝品類 Lis…

深挖 DeepSeek 隱藏玩法·智能煉金術2.0版本

前引&#xff1a;屏幕前的你還在AI智能搜索框這樣搜索嗎&#xff1f;“這道題怎么寫”“蘋果為什么紅”“怎么不被發現翹課” &#xff0c;。看到此篇文章的小伙伴們&#xff01;請準備好你的思維魔杖&#xff0c;開啟【霍格沃茨模式】&#xff0c;看我如何更新秘密的【知識煉金…

2025 年浙江危化品經營單位考試攻略分享?

浙江的考試由省應急管理部門主導。理論考試突出危化品在電商、物流等新興業態下的安全管理知識&#xff0c;這與浙江發達的電商產業緊密相關。對危險化學品的環境危害及防治知識考查細致。實際操作考核模擬杭州、寧波等地危化品倉儲物流中心的作業情況。? 報名材料準備齊全后…

【區塊鏈+ 房產建筑】山東省建筑產業互聯網平臺 | FISCO BCOS 應用案例

山東省建筑產業互聯網平臺&#xff08;山東省弘商易盟平臺&#xff09;是基于區塊鏈技術構建的分布式產業互聯網平臺&#xff0c; 旨在把各企業內部的供應鏈協同管理系統&#xff08;包括采購或者SRM 系統&#xff0c; 以及銷售或CRM 系統&#xff09;利用區塊鏈技術鏈接起來&a…

Bash 花括號擴展 {start..end} 進階使用指南——字典生成

Bash 的花括號擴展&#xff08;brace expansion&#xff09;{start..end} 是一個強大而靈活的語法特性&#xff0c;用于生成特定序列或組合。它在腳本編寫、爆破字典生成、文件批量操作以及模式匹配中有著廣泛的應用。本文將從基礎用法到高級技巧&#xff0c;帶你全面掌握這一功…

23種設計模式-結構型模式-享元

文章目錄 簡介問題解決方案享元與不可變性享元工廠 代碼總結 簡介 亦稱&#xff1a;緩存、Cache、Flyweight。享元是一種結構型設計模式&#xff0c;它摒棄了在每個對象中保存所有數據的方式&#xff0c;通過共享多個對象所共有的相同狀態&#xff0c;讓你能在有限的內存容量中…

MFC BCGControlBar

BCGControlBar&#xff08;也稱為 BCGSoft 或 BCGControlBar Library&#xff09;是一個用于 MFC&#xff08;Microsoft Foundation Classes&#xff09; 的擴展庫&#xff0c;主要提供現代化的 UI 控件、Ribbon 界面、工具欄、屬性網格等組件&#xff0c;幫助開發者快速構建專…

【算法手記9】OR26 最長回文子串 NC369 [NOIP2002 普及組] 過河卒

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:刷題 ??操作環境:牛客網 一.OR26 最長回文子串 牛客網題目鏈接(點擊即可跳轉):OR26 最長回文子串 題目詳情: 本題詳情如下圖: 題目思路: 本題解題思路如下: 本題思路用中心擴展算法,遍歷所有字符,將每個字符作為回文串…

批量刪除或替換文本文件中指定的行,如刪除第一行、刪除最后一行

每一個文本文件中我們都可以插入非常多的行&#xff0c;我們可以對行的內容進行刪除、修改等各種操作。如果文本文件中的某些行的內容需要更新&#xff0c;那我們就需要對其進行修改操作。想要修改文本文件的內容其實是非常方便的&#xff0c;但是如果想要批量的對多個文本文件…

LLM架構解析:詞嵌入模型 Word Embeddings(第二部分)—— 從基礎原理到實踐應用的深度探索

本專欄深入探究從循環神經網絡&#xff08;RNN&#xff09;到Transformer等自然語言處理&#xff08;NLP&#xff09;模型的架構&#xff0c;以及基于這些模型構建的應用程序。 本系列文章內容&#xff1a; NLP自然語言處理基礎詞嵌入&#xff08;Word Embeddings&#xff09…

機構數據服務

一、背景說明 券商/基金/銀行等金融機構的數據中心&#xff0c;基本都外購有數十家各類數據&#xff0c;自有業務每天也在產生海量信息。如何有效管理和使用這些數據&#xff0c;通過數據服務&#xff0c;沉淀數據資產&#xff0c;機構研發和運維部門也在不斷嘗試和改進。 傳…

中和農信:讓金融“活水”精準澆灌鄉村沃土

2025年政府工作報告首提“投資于人”概念&#xff0c;并22次提及“金融”&#xff0c;強調要著力抓好“三農”工作&#xff0c;深入推進鄉村全面振興&#xff1b;一體推進地方中小金融機構風險處置和轉型發展&#xff1b;扎扎實實落實促進民營經濟發展的政策措施&#xff0c;切…

JavaScript重難點突破:期約與異步函數

同步和異步 ?同步&#xff08;Synchronous&#xff09;? ?定義&#xff1a;任務按順序依次執行&#xff0c;前一個任務完成前&#xff0c;后續任務必須等待。 ?特點&#xff1a;阻塞性執行&#xff0c;程序邏輯直觀&#xff0c;但效率較低 ?異步&#xff08;Asynchron…

學習總結 網格劃分+瞬態求解設置

網格劃分部分 1.導入幾何文件 導入我們的幾何模型&#xff0c;他的格式為.scdocx 2.添加局部尺寸BOI 因為要對對前緣和尾緣進行局部加密&#xff0c;所以進行一個BOI的局部加密&#xff0c;目標尺寸取的幾何尺寸的最小尺寸的0.1&#xff0c;就是0.4mm。 3.生成表面網格 表面…

.NET 使用 WMQ 連接Queue 發送 message 實例

1. 首先得下載客戶端&#xff0c;沒有客戶端無法發送message. 安裝好之后長這樣 我裝的是7.5 安裝目錄如下 tools/dotnet 目錄中有演示的demo 2. .Net 連接MQ必須引用bin目錄中的 amqmdnet.dll 因為他是創建Queuemanager 的核心庫&#xff0c; 項目中引用using IBM.WMQ; 才…

風電行業預測性維護解決方案:給風機裝上 “智能醫生”,實現故障 “秒級預警”

引言&#xff1a;風電設備故障為何成為 “運維黑洞”&#xff1f; 某海上風電場因齒輪箱軸承故障停機 3 天&#xff0c;直接損失 50 萬元發電量。傳統維護模式下&#xff0c;人工巡檢覆蓋率不足 40%&#xff0c;故障修復平均耗時 72 小時。而預測性維護通過物聯網 AI 技術&am…