LeetCode熱題100——146. LRU 緩存

https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

請你設計并實現一個滿足 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) 的平均時間復雜度運行。

小米一面,沒刷過題所以栽了,靜下來心看看解決方案

題解

題目中涉及到了 查詢、插入和刪除都要平均時間復雜度O(1),查詢想要時間復雜度O(1) 可以用數組,插入刪除如果使用數組無法滿足要求,因為從數組中刪除元素涉及到元素的移動復雜度 O(n), 我們必須使用鏈表來插入和刪除,鏈表分為單鏈表和雙鏈表,如果使用單鏈表刪除元素的話還是需要遍歷才能找到前后的元素,所以我們使用 哈希表查詢 + 雙鏈表操作 的思路

在這里插入圖片描述
通過設置head和tail虛節點,避免判空等處理,這樣取第一個元素時直接調用 head.next ,取最后一個元素時直接調用 tail.pre

class LRUCache {class Node {int val;int key;Node next;Node pre;public Node(int key, int val) {this.key = key;this.val = val;}}private int mSize;private Map<Integer, Node> map;private Node head;private Node tail;public LRUCache(int size) {mSize = size;map = new HashMap<>();// 技巧處,使用頭尾虛節點來處理 空異常head = new Node(-1, -1);tail = new Node(-1, -1);head.next = tail;tail.pre = head;}public int get(int key) {if (!map.containsKey(key)) return -1;Node node = map.get(key);removeNode(node);addToHead(node);return node.val;}public void put(int key, int val) {if (map.containsKey(key)) {removeNode(map.get(key));}Node node = new Node(key, val);map.put(key, node);addToHead(node);// 易錯點,超過限制時需要同時移除 雙鏈表 node和 map中的nodeif(map.size() > mSize){Node lastNode = tail.pre;removeNode(lastNode);map.remove(lastNode.key);}}private void addToHead(Node node) {Node first = head.next;head.next = node;node.next = first;first.pre = node;node.pre = head;}private void removeNode(Node node) {Node preNode = node.pre;Node nextNode = node.next;preNode.next = nextNode;nextNode.pre = preNode;}
}

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

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

相關文章

一個Pycharm窗口添加多個項目來滿足運行多個項目的需求

需求&#xff1a;此前項目文件只有D:\pythonProject 現在進行了如下操作 同時顯示兩個文件夾D:\pythonProject D:\pythonProject-gh操作步驟如下&#xff1a;最終結果如圖所示

mars3d實現省界線寬度>市界線寬度效果

效果圖&#xff1a; 實現代碼&#xff1a; export function showChinaLine() {map.basemap 2017graphicLayer new mars3d.layer.GeoJsonLayer({name: "全國省界",url: "https://data.mars3d.cn/file/geojson/areas/420000_full.json",format: simplifyG…

Stack、Queue and Deque

文章目錄一、適配器二、stcak模擬實現三、queue模擬實現四、vector和list的優缺點五、deque六、deque的優缺點七、deque為什么作為stack和queue的默認適配容器一、適配器1.適配器的概念&#xff1a;封裝一個已有對象&#xff0c;轉換其接口2.容器適配器&#xff1a;封裝一個已有…

[echart] Vue3中使用Echart時圖表不渲染

onMounted(() > {nextTick(() > {chartInstance echarts.init(document.getElementById(chart));chartInstance.setOption(option);}); });參考&#xff1a; Vue3中使用Echart時如何解決圖表不渲染或顯示空白的問題&#xff1f;

關于windows虛擬機無法聯網問題

看虛擬機相關的服務是否開啟 win R &#xff1a;services.msc確保這幾個服務都是可以的&#xff0c;沒有被禁止 如果寫的禁止&#xff0c;用下面的方法可以恢復服務在虛擬機里面打開虛擬網絡編輯器。還原默認配置即可&#xff0c;虛擬機網絡服務就開啟了。但也有一些加密軟件會…

將 YOLOv11 的 .pt 模型轉換為 YOLOv8 格式需要特定的處理流程 機器學習 計算機視覺cv

將 YOLOv11 的 .pt 模型轉換為 YOLOv8 格式需要特定的處理流程。以下是完整的轉換指南&#xff1a; 轉換原理 YOLOv11 和 YOLOv8 的核心差異在于&#xff1a; 模型結構&#xff1a;v11 使用 RepVGG 或 Swin Transformer 等新型骨干網絡輸出頭&#xff1a;v11 可能使用解耦頭或 …

BIFU幣富探索合規新路徑 助力用戶玩轉RWA

隨著區塊鏈技術的不斷發展&#xff0c;其在實體資產領域的應用正受到關注。通過技術手段實現資產信息的透明化、可追溯化&#xff0c;成為提升資產管理效率的新方向。所謂真實世界資產&#xff08;RWA&#xff09;的數字化管理&#xff0c;核心在于依托區塊鏈技術建立實體資產與…

05-netty基礎-ByteBuf數據結構

1 基本概念在網絡編程中&#xff0c;字節數據的處理是核心環節之一。無論是客戶端與服務器之間的通信&#xff0c;還是數據的編解碼操作&#xff0c;都離不開對字節緩沖區的高效管理。Java 原生的 ByteBuffer 雖然提供了基礎功能&#xff0c;但在靈活性、性能和易用性上存在諸多…

【Nginx反向代理】通過Nginx反向代理將多個后端server統一到同一個端口上的方法

文章目錄前言解決方案&#xff1a;使用 Nginx 做統一反向代理前言 在多人開發任務中&#xff0c;如果不同人負責不同的后端接口服務開發&#xff0c;那么就面臨著每個人的服務部署到不同的端口上&#xff0c;甚至有的人的服務部署在不同的服務器上。這時候前端如果想要調用后端…

Chrontel【CH7219A-BF】CH7219A USB-C和DP 1.4至HDMI 2.1協議轉換器,帶DSC解碼功能

G通用 D描述Chrontel 的 CH7219A 是一種低成本、低功耗的半導體器件 通過 USB Type-C 將 DisplayPort 信號轉換為 HDMI 2.0 連接器。這款基于 USB Type-C 的創新型 DisplayPort 接收器具有高 高性能DSC解碼器&#xff0c;集成HDMI 2.0發射器 專為 USB Type-C 轉 HDMI 2.0 轉換器…

瘋狂星期四文案網第26天運營日記

網站運營第26天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 30多ip,斷崖式下跌&#xff0c;習慣了。。 今日搜索引擎收錄情況 必應52個頁面&#xff0c;比昨日12 百度仍然只有首頁 谷歌收錄正常 …

元策聯盈:深耕金融領域,賦能行業發展?

元策聯盈&#xff1a;深耕金融領域&#xff0c;賦能行業發展元策聯盈在金融行業的深耕細作&#xff0c;不僅體現在為客戶提供優質服務上&#xff0c;更在于其對行業發展的積極推動和自身的不斷創新突破。行業貢獻與社會責任元策聯盈始終將社會責任融入企業發展的血脈之中。在助…

力扣-字母異位詞

這里我也是沒有太懂&#xff0c;只懂個大概&#xff0c;先統計p和當前窗口的字符&#xff0c;后主要在窗口大小固定為 p.length()&#xff0c;在 s 上滑動做文章&#xff0c;在s里找到p的長度大小&#xff0c;最后直接比較兩個頻率數組來判斷異位詞定長窗口做法class Solution …

華為數通HCIP

華為認證數通方向的 HCIP&#xff08;華為認證 ICT 高級工程師&#xff09;考試難度適中&#xff0c;既不像 HCIA&#xff08;初級&#xff09;那樣側重基礎概念&#xff0c;也不像 HCIE&#xff08;專家級&#xff09;需要復雜的綜合實驗和面試&#xff0c;但仍需要系統的知識…

在SQL SERVER 中,用SSMS 實現存儲過程的每日自動調用

在 SQL Server Management Studio (SSMS) 中實現每日自動調用存儲過程&#xff0c;需通過 ??SQL Server 代理作業??配置定時任務。以下是詳細操作步驟&#xff1a;&#x1f527; 一、啟用 SQL Server 代理服務&#xff08;前置條件&#xff09;??啟動服務??&#xff1a…

賽博算命之八字測算事業運勢的Java實現(四柱、五行、十神、流年、格局詳細測算)

個人主頁-愛因斯晨 文章專欄-賽博算命 最近學習人工智能時遇到一個好用的網站分享給大家&#xff1a; 人工智能學習 文末有投票&#xff0c;評論區有紅包哦&#xff01; 前言 在前段時間更新了賽博算命系列&#xff0c;出乎我的意料反響很好。也受到廣大網友的贊賞&#xff0…

2025 騰訊廣告算法大賽 Baseline 項目解析

項目概述 2025 騰訊廣告算法大賽 Baseline&#xff0c;一個簡單的序列推薦系統&#xff0c;主要用于建模用戶和物品的交互序列&#xff0c;并利用多模態特征&#xff08;文本、圖像等 embedding&#xff09;來提升推薦效果。 核心文件功能 1. main.py - 主訓練腳本 負責模型訓練…

數據結構(11)棧和隊列算法題 OVA

一、概念與結構 循環隊列是一種特殊的隊列&#xff0c;首尾相連成環&#xff0c;也叫環形隊列。環形隊列具有以下三個特點&#xff1a; &#xff08;1&#xff09;隊頭刪除數據&#xff0c;隊尾插入數據。 &#xff08;2&#xff09;給定固定的空間&#xff0c;使用過程中不…

九聯UNT403HS_海思MV320處理器_安卓9-優盤強刷刷機包

九聯UNT403HS_海思MV320處理器_安卓9-優盤強刷刷機包前言&#xff1a;九聯UNT403HS&#xff0c;海思MV320芯片&#xff0c;已知有2種內存型號&#xff0c;分別是28G和216G。已知河南融合版本是28G&#xff0c;廣東版好像既有28G又有216G。理論上固件沒有本質區分&#xff0c;能…

Xilinx高性能低延時PCIe-DMA控制器IP,SGDMA,QDMA,RDMA,CDMA,V4L2驅動,視頻采集、AD采集

Multi-Channel High Performance PCIe QDMA&RDMA IP介紹基于PCI Express Integrated Block&#xff0c;Multi-Channel PCIe QDMA Subsystem實現了使用DMA地址隊列的獨立多通道、高性能Continous&#xff08;CDMA&#xff09;或Scather Gather DMA&#xff08;SGDMA&#xf…