力扣刷題記錄【1】146.LRU緩存

前言:

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

關鍵設計說明

  1. 雙向鏈表:維護訪問順序

    • 頭部節點 (head.next):最近使用的數據

    • 尾部節點 (end.prev):最久未使用的數據

    • 節點移動/刪除操作都是 O(1) 時間復雜度

  2. 哈希表:提供 O(1) 的鍵值查找

    • Map<Integer, DLinkedNode>?映射鍵到鏈表節點

    • 快速判斷鍵是否存在并獲取對應節點

  3. 哨兵節點:簡化邊界處理

    • 頭節點 (head) 和尾節點 (end) 作為虛擬節點

    • 避免空指針檢查,使代碼更簡潔

  4. 操作流程

    • get():存在則移動節點到頭部

    • put()

      • 存在 → 更新值并移到頭部

      • 不存在 → 創建新節點并添加到頭部

      • 容量超限 → 移除尾部節點

復雜度分析

  • 時間復雜度get()?和?put()?均為?O(1)

    • 哈希表操作:O(1) 的查找/插入/刪除

    • 鏈表操作:O(1) 的節點添加/刪除/移動

代碼實現:

import java.util.HashMap;
import java.util.Map;
class LRUCache {//雙向鏈表class DLinkedNode{int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode(){}public DLinkedNode(int key,int value){this.key = key;this.value = value;}}//LRU緩存的屬性//容量private int capacity = 0;//實際個數private int size = 0;//map裝的key,node節點private final Map<Integer,DLinkedNode> cache = new HashMap();//鏈表前后節點哨兵,方便操作頭尾。private final DLinkedNode head = new DLinkedNode();private final DLinkedNode end = new DLinkedNode();//初始化緩存public LRUCache(int capacity) {//不僅僅是賦值還要初始化鏈表//頭尾節點互相指向head.next = end;end.prev = head;this.capacity = capacity;}public int get(int key) {//得到nodeDLinkedNode node = cache.get(key);//判斷是否存在,存在就添加到鏈表頭部if(node==null){return -1;}moveToNode(node);return node.value;}public void put(int key, int value) {DLinkedNode node = cache.get(key);if(node!=null){//已經存在就重新賦值node.value = value;moveToNode(node);}else{//不存在就要新建一個節點,在放入mapDLinkedNode Newnode = new DLinkedNode(key,value);cache.put(key,Newnode);addToTop(Newnode);size++;}//判斷是否溢出if(size>capacity){//移除最后一個元素DLinkedNode endnode = end.prev;removeEndNode(endnode);}}//輔助方法//添加到鏈表頭部public void addToTop(DLinkedNode node){node.prev = head;head.next.prev = node;node.next = head.next;head.next = node;}//移動鏈表到頭部public void moveToNode(DLinkedNode node){removeNode(node);addToTop(node);}//移除nodepublic void removeNode(DLinkedNode node){node.next.prev = node.prev;node.prev.next = node.next;}//移除最后一個元素,還要清除hashpublic void removeEndNode(DLinkedNode node){removeNode(node);cache.remove(node.key);size--;}
}

總結

本人是一個菜鳥,沒怎么刷算法題,這算是我第一次刷算法題,不過基本的數據結構我還是會,這道題我是直接問的ai因為我完全沒有思路,覺得這個很難,然后看了ai的解法,和思路,感覺非常清晰,就去自己動手寫了一遍,一次過,很有成就感,后續也會繼續刷題。

如果我的文章成功幫助了你,請點贊加關注,你們的支持是我最大的動力。

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

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

相關文章

西門子S7-1200 PLC主流通信方法及應用

一、通信基礎 1. 網絡術語與設備 - 關鍵設備&#xff1a;交換機、路由器、網關等。 - 物理接口&#xff1a;RS-485&#xff08;支持多點通信&#xff09;、RS-232C&#xff08;點對點串行通信&#xff09;。 2. OSI參考模型 - 核心框架&#xff1a;理解協議分層&…

MySQL實現任意級子目錄的主要方案以及區別

常見的實現方案及區別 1. 鄰接表&#xff08;Adjacency List&#xff09; 方案描述&#xff1a; 每條記錄存儲一個節點的父節點ID。 表結構大致&#xff1a; id INT PRIMARY KEY, name VARCHAR(...), parent_id INT -- 指向父節點的ID&#xff0c;根節點為NULL或0優點&…

Linux網絡socket套接字(完)(5)

文章目錄前言一、多進程版的Tcp網絡程序捕捉SIGCHLD信號讓孫子進程提供服務二、多線程版的Tcp網絡程序三、線程池版的Tcp網絡程序四、Tcp協議通訊流程通訊流程總覽三次握手的過程數據傳輸的過程四次揮手的過程總結前言 結束嘍&#xff0c;至少這個Tcp套接字有關內容要結束了~ ?…

Web3 Study Log 003

Web3 Study Log 003 2025-7-5 這幾天各種各樣的瑣事&#xff0c;處理完了&#xff0c;真的煩&#xff0c;估計能消停一段時間了… 今天終于能夠坐下來好好學習&#xff0c;今天學習了chainlink的使用&#xff0c;能夠獲取 ETH/USD 實時價格&#xff0c;然后寫了一個簡單的眾…

Kotlin:2.1.20 的新特性

一、概述 The Kotlin 2.1.20 release is here! Here are the main highlights: Kotlin 2.1.20發布了&#xff0c;主要亮點如下&#xff1a; K2 compiler updates: updates to the new kapt and Lombok pluginsKotlin Multiplatform: new DSL to replace Gradle’s Application …

設計模式 | 觀察者模式

觀察者模式&#xff08;Observer Pattern&#xff09;是行為型設計模式中的事件通知專家&#xff0c;它定義了對象間一種一對多的依賴關系&#xff0c;當一個對象狀態改變時&#xff0c;所有依賴它的對象都會自動收到通知并更新。這種模式實現了發布-訂閱機制&#xff0c;是事件…

Apache Struts2 遠程命令執行漏洞(S2-052)

一、漏洞概述 S2-052 是 Apache Struts2 框架中一個高危的遠程代碼執行漏洞&#xff08;CVE-2017-9805&#xff09;&#xff0c;由安全研究人員于 2017 年發現并公開。該漏洞源于 Struts2 的 REST 插件在使用 XStream 組件處理 XML 反序列化時&#xff0c;未對用戶輸入的 XML 數…

RS觸發器Multisim電路仿真——硬件工程師筆記

目錄 1 RS觸發器基礎知識 1.1 工作原理 1.2 電路結構 1.3 特點 1.4 應用 1.5 設計考慮 1.6 總結 2 與非門實現基本RS觸發器 2.1 電路結構 2.2 工作原理 2.3 特點 2.4 總結 3 或非門實現基本RS觸發器 3.1 電路結構 3.2 工作原理 3.3 特點 3.4 總結 4 與非門實…

提示技術系列(12)——程序輔助語言模型

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

明遠智睿H618:開啟多場景智慧生活新時代

在數字化浪潮的推動下&#xff0c;智能設備正深刻地改變著我們的生活方式。明遠智睿H618以其強大的功能和卓越的性能&#xff0c;在家庭娛樂、商業展示、教育培訓和智能家居控制等多個領域展現出巨大的應用潛力&#xff0c;開啟了多場景智慧生活的新時代。 家庭娛樂&#xff1…

探秘展銷編輯器:相較于傳統展銷的卓越優勢與甄選指南?

在競爭激烈的商業環境中&#xff0c;企業期望通過展銷活動提升品牌知名度、推廣產品和拓展市場&#xff0c;但傳統展銷方式存在諸多難題。一是場地限制&#xff0c;優質場地稀缺、租金貴、檔期緊&#xff0c;場地空間和布局也不一定合適;二是展示形式單一&#xff0c;多為靜態展…

第31篇:塊設備與字符設備管理深度解析(基于OpenEuler 24.03)

塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09; 文章目錄 塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09;一、設備基礎概念體系1.1 塊設備的核心特性與分類1.2 字符設備的流式數據模型1.3 設備標識系統&#xff1a;主設…

Django Channels WebSocket實時通信實戰:從聊天功能到消息推送

引言 在Web開發中&#xff0c;實時通信功能&#xff08;如在線聊天、實時通知、數據推送&#xff09;已成為許多應用的核心需求。傳統的HTTP協議由于其請求-響應模式的限制&#xff0c;無法高效實現實時通信。WebSocket作為一種全雙工通信協議&#xff0c;為實時Web應用提供了…

day52 神經網絡調參指南

目錄 隨機種子 內參的初始化 神經網絡調參指南 參數的分類 調參順序 初始化參數 batchsize的選擇 學習率調整 激活函數的選擇 損失函數的選擇 模型架構中的參數 正則化系數 其他補充 隨機種子 import torch import torch.nn as nn# 定義簡單的線性模型&#xf…

.NET9 實現斐波那契數列(FibonacciSequence)性能測試

在 .NET 平臺上實現 斐波那契數列 并使用 BenchmarkDotNet 進行性能測試&#xff0c;是評估不同算法實現方式性能表現的一種高效且標準化的方法。通過該方式&#xff0c;可以對比遞歸、迭代、記憶化遞歸以及結合高性能優化技術&#xff08;如 Span<T>、Memory<T> 和…

三、docker軟件安裝:gitlab,nexus,mysql8,redis,nacos,nginx

目錄 1.gitlab安裝 2.nexus安裝 (1)下載啟動 (2)設置中央倉庫遠程地址 (3)配置maven的settings.xml 3.mysql8安裝 4.redis安裝 5.nacos安裝 6.nginx安裝 1.gitlab安裝 #創建目錄 cd /usr/local/ mkdir docker cd docker/ mkdir gitlab_docker cd gitlab_docker…

【與AI+】SAP WEBGUI集成開發與SAP INTERNET服務的關系

前言&#xff1a;這是我的水水專欄第五篇文章&#xff0c;這個專欄呢&#xff0c;是放一些我向AI提問的問題&#xff0c;以及AI的回答。因為感覺真的好方便哈哈哈~ 我不是很確定我的專欄文章內容是否涉及版權&#xff0c;以及也不確定這些整合過的文字是否涉嫌抄襲&#xff0c…

淺談幾種js設計模式

JavaScript設計模式是開發中常用的一種解決方案&#xff0c;它們幫助開發者以一種更結構化、更易維護的方式編寫代碼。本文將深入介紹幾種常見的JavaScript設計模式&#xff0c;包括單例模式、工廠模式、觀察者模式和策略模式。 一、單例模式&#xff08;Singleton Pattern&am…

手寫 Vue 中虛擬 DOM 到真實 DOM 的完整過程

目錄 一、虛擬 DOM 的核心概念 二、虛擬 DOM 到真實 DOM 的流程 三、手寫虛擬 DOM 到真實 DOM 的實現 1. 定義虛擬 DOM 的結構&#xff08;VNode&#xff09; 2. 創建虛擬 DOM 轉真實 DOM 的函數 3. 掛載虛擬 DOM 到頁面 4. 更新虛擬 DOM 的過程&#xff08;Diff 算法簡化…

jmm--volatile

指令重排基礎概念 在現代處理器和編譯器為了提高程序執行效率&#xff0c;會對指令進行優化&#xff0c;其中一種優化方式就是指令重排序。在單線程環境下&#xff0c;指令重排序不會影響最終執行結果&#xff0c;因為處理器和編譯器會保證重排序后的執行結果與按照代碼順序執行…