力扣146 - LRU緩存

視頻講解

哈希 + 雙向鏈表

為什么要用雙向鏈表?

快速刪除節點(O(1))

如果是單鏈表的話,刪除一個節點時,需要從頭遍歷,找到前驅節點,才能修改 prev->next,導致 O(n) 的時間復雜度

雙向鏈表存儲了兩個指針,一個指針指向下一個節點,另一個指針指向上一個節點(前驅指針)。所以我們可以根據前驅指針快速找到上一個節點,然后移除掉當前節點。

demo:

class LRUCache {
public:struct Node{int key,val;Node *prev,*next;Node(int k,int v) : key(k) , val(v) , prev(nullptr) , next(nullptr){}};map<int,Node*>mp;Node *L,*R; //雙哨兵int n; //LRU的總數//創建操作LRUCache(int capacity) {n = capacity;L = new Node(-1,-1);R = new Node(-1,-1);L->next = R;R->prev = L;}//獲取值操作 (獲得值的時候需要注意:如果有值存在哈希表中的話,那么就要將這個值放在最新的地方)//比如: L | 2 1 4 | R //我們查詢1這個數,那么查完后需要變成: L | 2 4 1 | R int get(int key) {if(mp.count(key)){Node* node = mp[key];remove(node); //在鏈表中移除該節點 通過雙向指針移除insert(node->key,node->val); // 在鏈表中插入該節點return node->val;}else{return -1;}}//插入操作void put(int key, int value) {if(mp.count(key)){Node* node = mp[key];remove(node);insert(key,value); //這里需要用給的key和value而不是node->key和node->val(因為可能插入的是新的值)}else{if(mp.size() == n){Node* node = L->next; //滿了,需要移除的節點remove(node);insert(key,value);}else{insert(key,value);}}}//以下為自定義新增函數 remove是移除節點的函數 insert是插入節點的函數//同時在鏈表和哈希表中刪除nodevoid remove(Node* node){Node* pre = node->prev;Node* nxt = node->next;pre->next = nxt;nxt->prev = pre;mp.erase(node->key);}//同樣要同時操作鏈表和哈希表void insert(int key,int val){Node* node = new Node(key,val);Node* pre = R->prev;//這里是最后一個插入的數//向右pre->next = node;node->next = R;//向左node->prev = pre;R->prev = node;mp[key] = 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/news/897373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897373.shtml

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

相關文章

考研408

是否需要考研&#xff1f; 考研前期準備 目標院校 每年9月10月才會公布 考試時長3小時 數據結構 1.時間復雜度選擇題計算 2.順序表鏈表特點;指針、結構體語法&#xff0c;鏈表結點定義&#xff0c;鏈表頭結點與頭指針,常見的五種鏈 表&#xff0c;鏈表的插入刪除操作;順…

nodejs使用WebSocket實現聊天效果

在nodejs中使用WebSocket實現聊天效果&#xff08;簡易實現&#xff09; 安裝 npm i ws 實現 創建 server.js /*** 創建一個 WebSocket 服務器&#xff0c;監聽指定端口&#xff0c;并處理客戶端連接和消息。** param {Object} WebSocket - 引入的 WebSocket 模塊&#xff0c…

Web網頁制作(靜態網頁):千年之戀

一、是用的PyCharm來寫的代碼 二、代碼中所用到的知識點&#xff08;無 js&#xff09; 這段HTML代碼展示了一個簡單的注冊頁面&#xff0c;包含了多個HTML元素和CSS樣式的應用。 這段HTML代碼展示了一個典型的注冊頁面&#xff0c;包含了常見的HTML元素和表單控件。通過CSS樣…

操作系統知識點23

1.實時操作系統的主要設計目標&#xff1a;在嚴格時間氛圍內對外部請求做出反應。 2.當用戶程序正在處理器上運行時&#xff0c;若此刻取到了一條特權指令&#xff0c;則處理器將停止執行該指令&#xff0c;并產生一個“非法操作”的事件 3.某網絡監控系統中。多個被授權的用…

CSS—網格布局Grid

網格布局grid 提供了帶有行和列的基于網格的布局系統&#xff0c;無需使用浮動和定位。 當 HTML 元素的 display 屬性設置為 grid 或 inline-grid 時&#xff0c;它就會成為網格容器。 更多布局模式可以參考之前的博客&#xff1a; ??????CSS—flex布局、過渡transit…

如何將本地已有的倉庫上傳到gitee (使用UGit)

1、登錄Gitee。 2、點擊個人頭像旁邊的加號&#xff0c;選擇新建倉庫&#xff1a; 3、填寫倉庫相關信息 4、復制Gitee倉庫的地址 5、綁定我們的本地倉庫與遠程倉庫 6、將本地倉庫發布&#xff08;推送&#xff09;到遠程倉庫&#xff1a; 注意到此處報錯&#xff0c;有關于…

【JAVA面試題】Spring、Spring MVC、Spring Boot、Spring Cloud的區別與聯系

在Java生態中&#xff0c;Spring框架及其衍生技術&#xff08;如Spring MVC、Spring Boot、Spring Cloud&#xff09;是開發企業級應用的核心工具。它們在功能、定位和使用場景上各有側重&#xff0c;但又緊密聯系。本文將詳細解析它們的區別與聯系&#xff0c;幫助你在面試中更…

【Linux系統編程】初識系統編程

目錄 一、什么是系統編程1. 系統編程的定義2. 系統編程的特點3. 系統編程的應用領域4. 系統編程的核心概念5. 系統編程的工具和技術 二、操作系統四大基本功能1. 進程管理&#xff08;Process Management&#xff09;2. 內存管理&#xff08;Memory Management&#xff09;3. 文…

Web基礎:HTML快速入門

HTML基礎語法 HTML&#xff08;超文本標記語言&#xff09; 是用于創建網頁內容的 標記語言&#xff0c;通過定義頁面的 結構和內容 來告訴瀏覽器如何呈現網頁。 超文本&#xff08;Hypertext&#xff09; 是一種通過 鏈接&#xff08;Hyperlinks&#xff09; 將不同文本、圖像…

Linux基本操作指令3

1、wget: 這是一個用于從網絡上下載文件的命令行工具。它支持 HTTP、HTTPS 和 FTP 協議。 wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 2、下載完成后&#xff0c;你可以通過以下命令使文件可執行并運行安裝程序&#xff1a; ch…

Deeplabv3+改進3:在主干網絡中添加NAMAttention|助力漲點!

??【DeepLabv3+改進專欄!探索語義分割新高度】 ?? 你是否在為圖像分割的精度與效率發愁? ?? 本專欄重磅推出: ? 獨家改進策略:融合注意力機制、輕量化設計與多尺度優化 ? 即插即用模塊:ASPP+升級、解碼器 PS:訂閱專欄提供完整代碼 目錄 論文簡介 步驟一 步驟二…

二分查找(遞歸和迭代)– Python

1. 使用遞歸進行二分查找的 Python 程序 創建一個遞歸函數&#xff0c;并將搜索空間的 mid 與 key 進行比較。根據結果&#xff0c;要么返回找到鍵的索引&#xff0c;要么調用下一個搜索空間的遞歸函數。 # 用于遞歸二進制搜索的 Python 3 程序。 # 在注釋中可以找到對舊版 Pyt…

電力場景絕緣子缺陷分割數據集labelme格式1585張4類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件) 圖片數量(jpg文件個數)&#xff1a;1585 標注數量(json文件個數)&#xff1a;1585 標注類別數&#xff1a;4 標注類別名稱:["broken part","broken insulat…

部署說明書

一、打開IIS功能 1、 雙擊“此電腦” 2、 在空白地方右鍵后&#xff0c;點擊屬性 3、 點擊控制面板主頁 4、 查看方式選擇小圖標&#xff0c;然后點擊”程序和功能” 5、點擊”啟用或關閉Windows功能” 6、 勾選”Internet Information Services”勾選“IIS管理服務…

在vue2項目中el-table表格的表頭和內容錯位問題

一、問題描述以及產生原因 問題描述&#xff1a;當el-table表格有橫向滾動條和縱向滾動條&#xff0c;把橫向滾動條拉到最右邊&#xff0c;表格的表頭會和內容錯位&#xff08;表頭和內容列不對齊&#xff09;問題產生原因&#xff1a;在el-table有縱向滾動條時&#xff0c;el…

《基于深度學習的圖像修復技術研究與應用-圖像修復》—3000字論文模板

摘要(500字) (擴展方向:補充具體技術指標與創新點量化描述) 本文針對圖像修復技術展開研究,重點探討了基于深度學習的方法在圖像修復領域的應用。研究首先回顧了傳統圖像修復技術,隨后深入分析了深度學習在圖像修復中的優勢。本文提出了一種改進的深度學習圖像修復模型…

基于Python+Vue的智能服裝商城管理系統的設計與實現

&#x1f457; 基于PythonVue的智能服裝商城管理系統的設計與實現 電商級解決方案&#xff1a;全棧技術融合 智能推薦系統 多維度數據分析 項目亮點&#xff1a;課程設計優選 | 企業級架構規范 | 完整電商功能閉環 | 畢業設計選擇 &#x1f310; 在線資源速覽 類別地址訪問方…

【二】JavaScript能力提升---this對象

目錄 this的理解 this的原理 事件綁定中的this 行內綁定 動態綁定 window定時器中的this 相信小伙伴們看完這篇文章&#xff0c;對于this的對象可以有一個很大的提升&#xff01; this的理解 對于this指針&#xff0c;可以先記住以下兩點&#xff1a; this永遠指向一個…

使用vue3.0+electron搭建桌面應用并打包exe

使用vue3.0electron搭建桌面應用并打包exe_如何使用electron將vue3vite開發完的項目打包成exe應用程序-CSDN博客

linux如何判斷進程對磁盤是隨機寫入還是順序寫入?

模擬工具&性能測試工具&#xff1a;fio fio參數說明&#xff1a; filename/dev/sdb1&#xff1a;測試文件名稱&#xff0c;通常選擇需要測試的盤的data目錄。 direct1&#xff1a;是否使用directIO&#xff0c;測試過程繞過OS自帶的buffer&#xff0c;使測試磁盤的結果更真…