每天寫兩道(二)LRU緩存、

146.LRU 緩存

. - 力扣(LeetCode)

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

思路:雙向鏈表+一個哨兵節點,使用map記錄(key,node)

(圖和思路都是偷力扣大佬的)?

實現:

class Node {constructor(key, value) {this.key = keythis.value = valuethis.pre = nullthis.next = null}
}class LRUCache {constructor(capacity) {this.capacity = capacitythis.dummy = new Node()this.dummy.next = this.dummythis.dummy.pre = this.dummy// 哈希表 用來存key和節點nodethis.keyToNodeMap = new Map()}// 刪除x節點delete(x) {x.pre.next = x.nextx.next.pre = x.pre}// 將節點添加在鏈表頭 哨兵節點后addTop(x) {x.pre = this.dummyx.next = this.dummy.nextx.pre.next = xx.next.pre = x}getNode(key) {// 沒有該節點if (!this.keyToNodeMap.has(key)) { return null;}// 有 拿出來放在頭部const node = this.keyToNodeMap.get(key); this.delete(node); this.addTop(node); return node;}get(key) {const node = this.getNode(key)return node?node.value:-1}put(key, value) {let node = this.getNode(key)// 有這個值 拿出來更新if (node) {node.value = value} else {// 新建節點放入node = new Node(key, value)this.keyToNodeMap.set(key, node)this.addTop(node)// 判斷有沒有溢出if (this.keyToNodeMap.size > this.capacity) {const backNode = this.dummy.prethis.keyToNodeMap.delete(backNode.key)this.delete(backNode)}}}
}

215.數組中最大的第k個元素

. - 力扣(LeetCode)

給定整數數組?nums?和整數?k,請返回數組中第?k?個最大的元素。

請注意,你需要找的是數組排序后的第?k?個最大的元素,而不是第?k?個不同的元素。

你必須設計并實現時間復雜度為?O(n)?的算法解決此問題。?

思路:

看的是這位佬的:. - 力扣(LeetCode)

利用大根堆根節點最大的特性,構建大根堆,將根節點與最末尾節點交換,移出這個最大節點,再進行排序。。。

利用的是堆的思想,但實際是用數組來實現的?

順序存儲二叉樹的特點:

第 n 個元素的 左子節點 為 2*n+1
第 n 個元素的 右子節點 為 2*n+2
第 n 個元素的 父節點 為 (n-1)/2
最后一個非葉子節點為 Math.floor(arr.length/2)-1

實現:

var findKthLargest = function (nums, k) {let len = nums.length// 先構建大根堆buildMaxHeap(nums, len)// 循環 將大根堆根節點和最末尾的節點交換// 循環到第k+1個最大就停止 最后返回的nums的根節點就是目標數// 這里for循環要用nums.length,不能用len,因為len是會改變的for (let i = nums.length - 1; i >= nums.length - k + 1; i--) {swap(nums, 0, i) // 將最大節點和最末尾的節點交換// 調整大根堆maxHeapify(nums, 0, --len) // 移到最后的節點不參與調整}return nums[0] // 返回第k個最大的值// 創建大根堆 自下而上構建大根堆function buildMaxHeap(nums, len) {// 最小非葉子節點:Math.floor(arr.length/2)-1for (let i = Math.floor(len / 2) - 1; i >= 0; i--) {maxHeapify(nums, i, len)}}function maxHeapify(nums, i, len) {let left = i * 2 + 1 // i的左子節點let right = i * 2 + 2 // i的右子節點let largest = i // 最大值的節點下標// 和左子節點比較if (left < len && nums[left] > nums[largest]) {largest = left}// 和右子節點比較if (right < len && nums[right] > nums[largest]) {largest = right}if (i !== largest) {swap(nums, i, largest) // 將子節點與父節點交換maxHeapify(nums, largest, len) // 再繼續向下比較}}function swap(nums, a, b) {let temp = nums[a]nums[a] = nums[b]nums[b] = temp}};

?今天寫的兩道都有點難,對于我這個白癡來說,所以明天還要再寫一遍!!!

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

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

相關文章

如何使用Python和大模型進行數據分析和文本生成

如何使用Python和大模型進行數據分析和文本生成 Python語言以其簡潔和強大的特性&#xff0c;成為了數據科學、機器學習和人工智能開發的首選語言之一。隨著大模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-4的崛起&#xff0c;我們能夠利用這些模型實現諸多…

Revit——(2)模型的編輯、軸網和標高

目錄 一、關閉縮小的隱藏窗口 二、標高&#xff08;可創建平面&#xff0c;其他標高線復制即可&#xff09; 三、軸網 周圍的四個圈和三角表示四個里面&#xff0c;可以移動&#xff0c;不要刪除 一、關閉縮小的隱藏窗口 二、標高&#xff08;可創建平面&#xff0c;其他標…

計算機體系結構期末快速復習

文章目錄 前言CPI&#xff0c;MIPS&#xff08;大題1&#xff09;加速比&#xff08;大題2&#xff09;流水線&#xff08;大題3&#xff09;CRAY-1向量機&#xff08;大題4&#xff09;Tomasulo算法&#xff08;大題5&#xff09;概念簡答題計算機系統結構的經典定義什么是透明…

深入分析 Android Activity (二)

文章目錄 深入分析 Android Activity (二)1. Activity 的啟動模式&#xff08;Launch Modes&#xff09;1.1 標準模式&#xff08;standard&#xff09;1.2 單頂模式&#xff08;singleTop&#xff09;1.3 單任務模式&#xff08;singleTask&#xff09;1.4 單實例模式&#xf…

利用邊緣計算網關的工業設備數據采集方案探討-天拓四方

隨著工業4.0時代的到來&#xff0c;工業設備數據采集成為了實現智能制造、提升生產效率的關鍵環節。傳統的數據采集方案往往依賴于中心化的數據處理方式&#xff0c;但這種方式在面對海量數據、實時性要求高的工業場景時&#xff0c;往往顯得力不從心。因此&#xff0c;利用邊緣…

CSS實現一個雨滴滑落效果

使用純CSS來實現一個真實的雨滴滑落效果可能會有些挑戰&#xff0c;因為CSS主要關注于靜態樣式和簡單的動畫效果。然而&#xff0c;你可以使用CSS動畫和keyframes來模擬一個雨滴滑落的簡化效果。 以下是一個基本的示例&#xff0c;展示如何使用CSS來模擬雨滴從頂部滑落到底部的…

AI學習指南數學工具篇-MATLAB中的凸優化工具

AI學習指南數學工具篇-MATLAB中的凸優化工具 在人工智能領域&#xff0c;凸優化是一個非常重要的數學工具&#xff0c;它在機器學習、深度學習、數據分析等領域都有著廣泛的應用。而MATLAB作為一款強大的數學工具軟件&#xff0c;提供了豐富的凸優化工具和函數&#xff0c;為用…

二叉樹的鏈式結構(二叉樹)與順序結構(堆)---數據結構

一、樹的概念與結構 1、樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。我們常把它叫做樹&#xff0c;是因為它看起來像一棵倒掛的樹&#xff0c;它的根是朝上的&#xff0c;而葉是朝下的。 下面…

給我一個用斷言結果執行下一步的例子

在使用 pytest 和 Selenium 進行自動化測試時&#xff0c;通常我們會根據斷言的結果來決定測試流程的走向。如果斷言失敗&#xff0c;測試通常會停止執行后續的步驟&#xff0c;因為失敗意味著被測系統沒有按照預期工作。然而&#xff0c;有時候我們可能需要在斷言失敗后執行特…

每日復盤-20240528

今日重點關注&#xff1a; 20240528 六日漲幅最大: ------1--------300956--------- 英力股份 五日漲幅最大: ------1--------301361--------- 眾智科技 四日漲幅最大: ------1--------301361--------- 眾智科技 三日漲幅最大: ------1--------301361--------- 眾智科技 二日漲…

前端編程語言——JS背景知識、JS基礎語法、算數運算符和關系運算符(1)

0、前言&#xff1a; JS全稱是JavaScript&#xff0c;是一種腳本語言&#xff0c;誕生于1995年&#xff0c;JS是由ECMAScript&#xff08;包含js語法&#xff09;、BOM&#xff08;Brower Oject Model&#xff0c;和瀏覽器相關操作&#xff09;、DOM&#xff08;Document Obje…

ubuntu設置中文輸入法教程

在 Ubuntu 上設置中文輸入法可以通過以下步驟來完成。我們將以安裝和配置 fcitx 輸入法框架及其中文輸入法插件 fcitx-sunpinyin 為例。 ### 步驟一&#xff1a;安裝 fcitx 和中文輸入法插件 1. **更新軟件包列表** 打開終端并運行以下命令來更新軟件包列表&#xff1a; …

淺談—“文件映射”

目錄 文件映射頭文件&#xff1a; 核心函數 port flags 文件映射頭文件&#xff1a; #include<sys/mman.h> 核心函數 void *mmap(void *addr,size_t length, int port,int flags,int fd, off_t offset ); int munmap(void *addr,size_t length);// 對比free&#x…

聯邦和反射器實驗

拓撲圖 一.實驗要求 1.AS1存在兩個環回&#xff0c;一個地址為192.168.1.0/24&#xff0c;該地址不能在任何協議中宣告 AS3存在兩個環回&#xff0c;一個地址為192.168.2.0/24&#xff0c;該地址不能在任何協議中宣告 AS1還有一個環回地址為10.1.1.0/24&#xff…

PyTorch訓練關鍵點

1.背景 在網上找了一些資料用來訓練關鍵點&#xff0c;一般都是人臉或者車牌關鍵點訓練&#xff0c;或者是聯合檢測一起訓練。很少有是單獨基于輕量級網絡訓練單獨關鍵點模型的工程&#xff0c;本文簡單介紹一種簡單方法和代碼。 2.代碼模塊 &#xff08;1&#xff09;網絡結…

[C][動態內存分配][柔性數組]詳細講解

目錄 1.動態內存函數的介紹1.malloc2.free2.calloc4.realloc 2.常見的動態內存錯誤3.C/C程序的內存開辟4.柔性數組1.是什么&#xff1f;2.柔性數組的特點3.柔性數組的使用4.柔性數組的優勢 1.動態內存函數的介紹 1.malloc 函數原型&#xff1a;void* malloc(size_t size)功能…

iOS馬甲包, AB面,H5跳轉包,開發上架

什么是馬甲包 馬甲包一般是主APP的分身或者克隆&#xff0c;也或者說是穿著馬甲的一個APP&#xff0c;脫掉馬甲&#xff0c;APP將呈現另一種樣式&#xff0c;也就是常說的AB面APP。 1. 馬甲包、AB面、白包、h5跳轉包 2.蘋果開發者 3.TG&#xff1a;APPYKJ 4.喂心&#xff1…

【AI算法崗面試八股面經【超全整理】——概率論】

AI算法崗面試八股面經【超全整理】 概率論信息論機器學習CVNLP 目錄 1、古典概型、幾何概型2、條件概率、全概率公式、貝葉斯公式3、先驗概率、后驗概率4、離散型隨機變量的常見分布5、連續型隨機變量的常見分別6、數學期望、方差7、協方差、相關系數8、獨立、互斥、不相關9.大…

【PB案例學習筆記】-11動畫顯示窗口

寫在前面 這是PB案例學習筆記系列文章的第11篇&#xff0c;該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上傳到了gite…

ESP32 - Micropython ESP-IDF 雙線教程 WIFI (2)

ESP32 - Micropython ESP-IDF 雙線教程 WIFI ESP32 - IDF WIFI轉換為ESP32-IDF的示例代碼main/main.c 代碼解釋 ESP32 - IDF WIFI 轉換為ESP32-IDF的示例代碼 以下是使用ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;編寫的連接到Wi-Fi網絡的示例代碼…