每天寫兩道(二)LRU緩存、數組中最大的第k個元素

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/18784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18784.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18784.shtml

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

相關文章

類中使用QtConcurrent::run

在QtConcurrent::run中調用類的成員函數時&#xff0c;你需要注意幾個關鍵點&#xff1a; 對象生命周期&#xff1a;你需要確保在QtConcurrent::run調用的整個期間&#xff0c;類對象都是有效的。如果對象在成員函數執行期間被銷毀&#xff0c;將會導致未定義行為。成員函數訪…

在table表格中如何給tr的每一個子元素加haver效果

效果圖&#xff1a; 核心代碼&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改變子元素 tbody tr:hover {background-color: #d5d5d5; } 改變父元素 兩段代碼看起來一樣&#xff0c;其實不一樣&#xff0c;其中差了一個空格字符 希望可以幫到大家

多線程新手村3--多線程代碼案例

1.1 單例模式 單例模式是設計模式中非常經典的一種。那么有同學肯定就會好奇了&#xff0c;什么是設計模式呢&#xff1f; 設計模式簡單的說就是程序員的“棋譜”&#xff0c;我們下象棋時肯定或多或少都背過棋譜&#xff0c;例如當頭炮、馬后炮等&#xff0c;設計模式也是這…

接口性能測試復盤:解決JMeter超時問題的實踐

在優化接口并重新投入市場后&#xff0c;我們面臨著一項關鍵任務&#xff1a;確保其在高壓環境下穩定運行。于是&#xff0c;我們啟動了一輪針對該接口的性能壓力測試&#xff0c;利用JMeter工具模擬高負載場景。然而&#xff0c;在測試進行約一分鐘之后&#xff0c;頻繁出現了…

新人學習筆記之(函數2)

一、函數的參數 1.形參和實參 &#xff08;1&#xff09;在聲明函數時&#xff0c;可以在函數名稱后面的小括號中添加一些參數&#xff0c;這些參數被稱為形參&#xff0c;而在調用該函數時&#xff0c;同樣也需要傳遞相應的參數&#xff0c;這些參數被稱為實參 參數說明形參形…

【前端之npm鏡像地址】

npm鏡像地址 淘寶鏡像地址華為鏡像地址騰訊云鏡像地址 淘寶鏡像地址 npm config set registry https://registry.npmmirror.com查看鏡像設置: npm config get registry 華為鏡像地址 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ 騰訊云鏡像地…

【機器學習】分值融合方法

舉例假設現有圖片的預測分數文本的預測分數。為了合理地融合圖片和文本的預測分數&#xff0c;可以采取多種方法&#xff0c;包括加權平均、直接相加或相乘等&#xff0c;但需要注意兩者是否在同一空間。以下是一些常見的方法和考慮因素&#xff1a; FROM GPT4 1. 確定預測分…

Mysql數據庫創建自增序列

創建序列表 CREATE TABLE sequence (name varchar(50) NOT NULL,current_value bigint(30) NOT NULL,increment int(11) NOT NULL DEFAULT 1 ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENT序列表;創建函數 查詢當前序列名的序列值 CREATE DEFINERroot% FUNC…

Lambda表達式及Stream的使用

前言&#xff1a; 函數式編程是一種編程范式&#xff0c;它將計算過程視為函數應用的連續組合。函數式編程強調使用純函數&#xff08;Pure Function&#xff09;&#xff0c;避免使用可變狀態和副作用&#xff0c;倡導將計算過程抽象為函數&#xff0c;便于代碼的理解、測試和…

Pytorch訓練LeNet模型MNIST數據集

如何用torch框架訓練深度學習模型&#xff08;詳解&#xff09; 0. 需要的包 import torch from torch.nn import CrossEntropyLoss from torch.optim import SGD from torch.utils.data import DataLoader from torchvision import datasets, transforms1. 數據加載和導入 …

Python圖形界面(GUI)Tkinter筆記(九):用【Button()】功能按鈕實現人機交互

在Tkinter庫中,功能按鈕(Button)是實現人機交互的一個非常重要的組件: 【一】主要可實現功能及意義: (1)響應用戶交互: Button組件允許用戶通過點擊來觸發某個事件或動作。當用戶點擊按鈕時,可以執行一個指定的函數或方法。 (2)提供用戶輸入: Button組件是圖形用戶界面(G…

持續總結中!2024年面試必問 20 道 Rocket MQ面試題(三)

上一篇地址&#xff1a;持續總結中&#xff01;2024年面試必問 20 道 Rocket MQ面試題&#xff08;二&#xff09;-CSDN博客 五、什么是生產者&#xff08;Producer&#xff09;和消費者&#xff08;Consumer&#xff09;在RocketMQ中&#xff1f; RocketMQ是一個高性能、高吞…

Linux完整版命令大全(二十五)

pine 功能說明&#xff1a;收發電子郵件&#xff0c;瀏覽新聞組。語  法&#xff1a;pine [-ahikorz][-attach<附件>][-attach_and_delete<附件>][-attachlist<附件清單>][-c<郵件編號>][-conf][-create_lu<地址薄><排序法>][-f<收件…

劇本殺小程序開發,探索市場發展新的商業機遇

劇本殺游戲作為一個新興行業&#xff0c;經歷了爆發式的增長&#xff0c;劇本殺游戲在市場中的熱度不斷升高。 不過&#xff0c;在市場的火熱下&#xff0c;競爭也在逐漸加大。因此&#xff0c;在市場競爭下&#xff0c;成本低、主題多樣、有趣的線上劇本殺小程序成為了創業者…

竹云董事長在第二屆ICT技術發展與企業數字化轉型高峰論壇作主題演講

5月25日&#xff0c;由中國服務貿易協會指導&#xff0c;中國服務貿易協會信息技術服務委員會主辦的 “第二屆ICT技術發展與企業數字化轉型高峰論壇” 在北京隆重召開。 本次論壇以 “數據驅動&#xff0c;AI引領&#xff0c;打造新質生產力” 為主題&#xff0c;特邀業內200余…

WebGL實現醫學教學軟件

使用WebGL實現醫學教學軟件是一個復雜但非常有益的項目&#xff0c;可以顯著提升醫學教育的互動性和效果。以下是詳細的實現步驟&#xff0c;包括需求分析、技術選型、開發流程和注意事項。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作…

redis-cli help使用

1. redis-cli命令使用—先連接上服務器 連接到 Redis 服務器&#xff1a; 使用 redis-cli 命令即可連接到本地運行的 Redis 服務器&#xff0c;默認連接到本地的 6379 端口。 redis-cli如果 Redis 服務器不在本地或者端口不同&#xff0c;可以使用 -h 和 -p 參數指定主機和端…

華為校招機試 - LRU模擬(20240515)

題目描述 LRU(Least Recently Used)緩存算法是一種常用于管理緩存的策略,其目標是保留最近使用過的數據,而淘汰最久未被使用的數據。 實現簡單的LRU緩存算法,支持查詢、插入、刪除操作。 最久未被使用定義:查詢、插入和刪除操作均為一次訪問操作,每個元素均有一個最后…

探索Django 5: 從零開始,打造你的第一個Web應用

今天我們將一起探索 Django 5&#xff0c;一個備受開發者喜愛的 Python Web 框架。我們會了解 Django 5 的簡介&#xff0c;新特性&#xff0c;如何安裝 Django&#xff0c;以及用 Django 編寫一個簡單的 “Hello, World” 網站。最后&#xff0c;我會推薦一本與 Django 5 相關…

蘇洵,大器晚成的家風塑造者

&#x1f4a1; 如果想閱讀最新的文章&#xff0c;或者有技術問題需要交流和溝通&#xff0c;可搜索并關注微信公眾號“希望睿智”。 蘇洵&#xff0c;字明允&#xff0c;號老泉&#xff0c;生于宋真宗大中祥符二年&#xff08;公元1009年&#xff09;&#xff0c;卒于宋英宗治平…