LeetCode熱題100--146.LRU緩存--中等

1. 題目

請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。
實現 LRUCache 類:

  • LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存
  • int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值,否則返回 -1 。
  • void put(int key, int value) 如果關鍵字 key 已經存在,則變更其數據值 value ;如果不存在,則向緩存中插入該組 key-value 。如果插入操作導致關鍵字數量超過 capacity ,則應該 逐出 最久未使用的關鍵字。

函數 get 和 put 必須以 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

2. 題解

class LRUCache {private final int capacity;private final Map<Integer,Integer>cache = new LinkedHashMap<>(); //內置LRUpublic LRUCache(int capacity){this.capacity = capacity;}public int get(int key) {//刪除key,并利用返回值判斷key是否在cache中Integer value = cache.remove(key);if(value != null){cache.put(key,value);return value;}return -1;}public void put(int key, int value) {////刪除key,并利用返回值判斷key是否在cache中if(cache.remove(key) != null){cache.put(key,value);return;}if (cache.size() == capacity){Integer eldestKey = cache.keySet().iterator().next();cache.remove(eldestKey);}cache.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);*/

3. 解析

依舊出自這位老師:【圖解】一張圖秒懂 LRU!(Python/Java/C++/Go/JS/Rust)

  1. public LRUCache(int capacity): 這是構造函數,當創建LRUCache的實例時會被調用。它設置了緩存的容量大小并初始化了一個LinkedHashMap來作為實際的緩存。

  2. public int get(int key): 這個方法用于獲取指定鍵對應的值,如果緩存中不存在該鍵,則返回-1。它首先嘗試從緩存中刪除并重新插入鍵值對(如果存在于緩存中),然后再將新的鍵值對添加到緩存中。

  3. public void put(int key, int value): 這個方法用于向緩存中插入一個新的鍵值對。它首先嘗試從緩存中刪除并重新插入鍵值對(如果存在于緩存中),然后再將新的鍵值對添加到緩存中。如果緩存已滿(即達到其容量大小),則會移除最近最少使用的元素(即最后一個被插入的元素)以釋放新的空間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93127.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93127.shtml

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

相關文章

機器學習學習總結

一、機器學習到底是什么&#xff1f; 簡單說&#xff0c;機器學習就是讓計算機像人一樣 “從經驗中學習”。比如我們學騎自行車&#xff0c;摔多了就知道怎么保持平衡&#xff1b;計算機處理任務時&#xff0c;也能通過分析大量 “經驗數據”&#xff0c;自己找到規律&#xff…

Boost庫中boost::function函數使用詳解

1. 函數作用 boost::function 是 Boost 庫提供的一個 通用函數封裝器&#xff0c;可用于存儲、傳遞和調用任意可調用對象&#xff08;如普通函數、函數指針、Lambda、函數對象、成員函數指針等&#xff09;。它類似于 C11 及以上標準的 std::function。 作用總結&#xff1a; 可…

SQL Server安全刪除數據并釋放空間的技術方案

在SQL Server中執行大規模數據刪除時&#xff0c;直接使用DELETE語句可能導致日志文件暴漲、事務阻塞和性能下降。以下提供一種安全刪除數據并釋放磁盤空間的完整方案&#xff1a; 方案核心步驟 -- 設置讀未提交隔離級別&#xff08;避免鎖競爭&#xff09; SET TRAN ISOLATION…

EgoVLA——根據第一視角的人類視頻中訓練的VLA模型:助力家具組裝等人形靈巧操作任務的攻克(利用可穿戴手部追蹤)

前言 我在此文《ForceVLA——將具備力感知的MoE整合進π0的動作專家中&#xff1a;從而融合“視覺 語言 力反饋”三者實現精密插拔》的開頭說過&#xff0c;我司「七月在線」目前側重以下兩大本體的場景落地 人形層面&#xff0c;側重 1.1 人形靈巧操作 1.2 人形展廳講解機械…

廚具新風尚,解鎖廚房新體驗

在快節奏的現代生活中&#xff0c;廚房已不僅僅是烹飪的場所&#xff0c;更是家庭溫馨與創意的源泉。一款好的廚具&#xff0c;不僅能讓烹飪變得輕松愉悅&#xff0c;更能為餐桌增添無限風味。今天&#xff0c;就讓我們一起走進廚具的新世界&#xff0c;解鎖那些令人愛不釋手的…

手機長焦進化史:攀過十年,終抵云巔

今天&#xff0c;華為相機解決方案專家熊諶飛在《長焦十年之路對談》直播中&#xff0c;首次系統揭秘了華為手機長焦技術的十年進化史。從P9雙攝到Pura 80系列“一鏡雙目”&#xff0c;每一代影像旗艦&#xff0c;都有一段鮮為人知的誕生秘辛。不少觀眾這才恍然大悟&#xff1a…

鈣鈦礦光伏:十年磨一劍,產業化突圍路在何方?

2013年&#xff0c;一種具有高效太陽能轉化率、高電荷傳輸率、低成本、制作簡單等優點的新型太陽能電池材料——鈣鈦礦突然出現在大眾視野。相比于又重又硬、轉換效率通常只有22&#xff05;-26&#xff05;的傳統晶體硅太陽能板&#xff0c;鈣鈦礦太陽能電池薄如蟬翼可彎曲&am…

斷言:assert()的實用指南

目錄 一、斷言概述 二、基本用法 三、工作原理 四、斷言的優點 五、啟用和禁用斷言 六、性能考慮 七、最佳實踐 八、示例代碼 一、斷言概述 assert.h 頭文件定義了宏 assert()&#xff0c;用于在運行時驗證程序是否符合指定條件。如果條件不滿足&#xff0c;程序會報錯并…

開發避坑指南(27):Vue3中高效安全修改列表元素屬性的方法

需求 Vue3 中如何遍歷list并修改list元素的屬性的值&#xff1f; 解決辦法 1、?使用 map 方法? const newList list.value.map(item > {return {...item,modifiedProperty: newValue // 修改的屬性名稱和屬性值} })Vue 中的 map() 函數是 JavaScript 數組的高階函數&…

L4 級別自動駕駛 硬件架構設計

L4 級自動駕駛&#xff08;根據 SAE 標準&#xff0c;屬于 “高度自動化”&#xff09;的核心是系統在特定場景下&#xff08;如城市道路、高速路&#xff09;可完全自主完成駕駛任務&#xff0c;無需駕駛員干預&#xff0c;且在系統失效時能自動實現安全降級。其硬件架構需滿足…

【網絡安全測試】手機APP安全測試工具NowSecure 使用指導手冊(有關必回)

以下是 NowSecure安全測試工具 的詳細使用指導&#xff0c;涵蓋從環境準備、測試配置到報告分析的完整流程&#xff0c;適合團隊協作或合規性審計場景&#xff1a; NowSecure 使用指導手冊 1. 工具簡介 定位&#xff1a;自動化移動應用&#xff08;Android/iOS&#xff09;安全…

Matlab(5)進階繪圖

一、Advanced 2D plots1. Logarithm Plotsx logspace(-1,1,1000); % 從-1到1生成等間隔的1000個點 y x .^ 2; subplot(2,2,1); plot(x,y); title(Plot); subplot(2,2,2); semilogx(x,y); title(Semilogx); subplot(2,2,3); semilogy(x,y); title(Semilogy); subplot(2,2,4);…

運維學習Day22——Anisible自動化與基本使用

文章目錄01-Ansible 自動化介紹Ansible 自動化介紹手動執行任務和自動化執行任務基礎架構即代碼Ansible 與 DevOps什么是 ANSIBLE&#xff1f;Ansible 特點Ansible 概念和架構Ansible WayAnsible 用例Ansible 部署準備實驗環境控制節點受管節點LinuxWindows網絡設備02-Ansible …

Codeforces Deque工藝

題目來源&#xff1a; 問題 - 2128B - Codeforces 這道題有些地方表達的并不是特別準確&#xff0c;首先就是從最左端與最右端移除一個元素&#xff0c;實際含義是從原數組的最左端或者最右段依次取出一個元素構成一個新的數組&#xff0c;使得這個新數組的數組符合題目的“好…

談談《More Effective C++》的條款30:代理類

在《More Effective C》的條款30中&#xff0c;Scott Meyers深入探討了**代理類&#xff08;Proxy Classes&#xff09;**的設計與應用。代理類是一種通過重載運算符模擬原始對象行為的設計模式&#xff0c;其核心目標是在不直接暴露原始對象的情況下&#xff0c;提供額外功能、…

實用AI在線開發工具網址匯總(含免費限額,國內可訪)

AI在線開發工具 標題分類屬性在線開發工具1https://www.builder.io/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具2https://replit.com/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具3https…

react+vite來優化下每次使用hook函數都要引入的情況

前言&#xff1a;react項目中&#xff0c;每個頁面都得引入react/react-dom等元素&#xff0c;就像uniapp的項目中得onload,onshow等生命周期一樣&#xff0c;這里也可以用vite的插件&#xff1a;unplugin-auto-import 來解決我們每次都需要調用才能使用hook方法的問題。安裝&a…

【排序算法】⑤冒泡排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

如何使用gpt進行模式微調(2)?

對 GPT&#xff08;Generative Pre-trained Transformer&#xff09;類大模型進行微調&#xff08;Fine-tuning&#xff09;&#xff0c;是將其適配到特定任務或領域的關鍵步驟。以下是 ??全流程指南??&#xff0c;涵蓋方法選擇、數據準備、訓練配置、評估部署等核心環節&a…

基于飛算JavaAI實現圖書管理系統框架部署

摘要 本文詳細介紹了如何利用飛算JavaAI技術實現圖書管理系統的框架部署。首先闡述了飛算JavaAI的基本概念、特點和優勢&#xff0c;接著對圖書管理系統的需求進行分析&#xff0c;然后按照軟件開發流程&#xff0c;從系統設計、代碼生成、框架搭建到部署測試&#xff0c;逐步展…