算法打卡 Day13(棧與隊列)-滑動窗口最大值 + 前 K 個高頻元素 + 總結

文章目錄

  • Leetcode 239-滑動窗口最大值
    • 題目描述
    • 解題思路
  • Leetcode 347-前 K 個高頻元素
    • 題目描述
    • 解題思路
  • 棧與隊列總結

Leetcode 239-滑動窗口最大值

題目描述

https://leetcode.cn/problems/sliding-window-maximum/description/

在這里插入圖片描述

解題思路

在本題中我們使用自定義的單調隊列來實現:

pop:如果窗口移除的元素 value 等于單調隊列的出口元素,那么隊列彈出元素,否則不進行任何操作

push:如果 push 的元素 value 大于入口元素的數值,那么就將隊列入口的元素彈出,直到 push 元素的數值小于隊列入口元素的數值為止

返回當前窗口的最大值:調用 que.front()

class Solution {
private:class MyQueue {public:deque<int> que; //使用deque實現單調隊列void pop(int value) {if (!que.empty() && value == que.front()) {que.pop_front();}}void push(int value) {while (!que.empty() && value > que.back()) {que.pop_back();}que.push_back(value);}int front() {return que.front();}};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;for (int i = 0; i < k; i++) {que.push(nums[i]);}result.push_back(que.front());for (int i = k; i < nums.size(); i++) {que.pop(nums[i - k]);que.push(nums[i]);result.push_back(que.front());}return result;}
};

Leetcode 347-前 K 個高頻元素

題目描述

https://leetcode.cn/problems/top-k-frequent-elements/description/

在這里插入圖片描述

解題思路

這道題目需要解決三個部分的問題:

1. 統計元素的出現頻率:
我們可以使用 unordered_map 來解決,其中 key 表示元素的值,value 表示值出現的次數
2. 對頻率進行排序:
使用優先級隊列,其是一個披著隊列外衣的堆。優先級隊列對外接口是從隊頭取元素,從隊尾添加元素,其內部的元素自動依照元素的權值排列。優先級隊列缺省情況下 priority_queue 利用 max-heap 大頂堆完成對元素的排列,大頂堆是以 vector 為表現形式的完全二叉樹。

堆是完全二叉樹,樹中的每個結點都不小于(或不大于)其左右孩子的值。父親結點大于等于左右孩子的是大頂堆,小于等于左右孩子的是小頂堆。

選用優先級隊列而不是快排:我們只需要報告前 K 個高頻元素而不是全部元素,因此只需要維護 K 個有序序列即可,當 n 非常大時,這樣的方法可以降低時間復雜度。

使用小頂堆而不是大頂堆:因為要統計最大前 K 個元素,如果選用大頂堆會將最大的元素彈出不符合要求,而使用小頂堆可以每次將最小的元素彈出,最后小頂堆中積累的才是前 K 個最大元素。

3. 找出前 K 個高頻元素

class Solution {
public://小頂堆class mycomparison{public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {//統計元素出現的頻率unordered_map<int, int>map;for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}//根據頻率進行排序//定義一個小頂堆,大小為kpriority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;//用固定大小為k的小頂堆,掃描所有頻率的數值for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size() > k) {//如果堆的大小大于k,則從隊列彈出pri_que.pop();}}//找出前k個高頻元素,小頂堆先彈出最小的,所以使用倒序輸出數組vector<int> result(k);for (int i = k - 1; i >= 0; i--) {result[i] = pri_que.top().first;pri_que.pop();}return result;}};

棧與隊列總結

棧和隊列是容器適配器,底層容器使用不同的容器,那么棧內數據在內存中的分布就不一定連續。
在缺省狀況下,棧和隊列的默認底層容器時 deque,其內存分布不連續。

遞歸的實現是棧:每一次遞歸調用都會把函數的局部變量、參數值和返回地址等壓入調用棧中,然后遞歸返回的時候,從棧頂彈出上一次遞歸的各項參數,所以這就是遞歸為什么可以返回上一層位置的原因。

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

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

相關文章

C語言指針指針和數組筆試題(必看)

前言&#xff1a; 前面介紹了指針的大體內容&#xff0c;如果接下來能夠把這些代碼的含義搞得清清楚楚&#xff0c;那么你就是代碼king&#xff01; 一維數組&#xff1a; int a[] {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a0)); pr…

element-ui輸入框和多行文字輸入框字體不一樣解決

element-ui的type"textarea"的字體樣式與其他樣式不同 <el-input type"textarea"></el-input> <el-input ></el-input>設置&#xff1a; .el-textarea__inner::placeholder {font-family: "Helvetica Neue", Helvetic…

linux排查思路

1.賬號安全 who 查看當前登錄用戶&#xff08;tty本地登錄pts遠程登錄&#xff09; w 查看系統信息&#xff0c;想知道某一時刻用戶的行為 uptime 查看登錄多久、多少用戶&#xff0c;負載 1.查看用戶信息文件/etc/passwd root:x:0:0:root:/root:/bin:/b…

刪除MySQL中所有表的外鍵

方法一&#xff1a; 原理 查詢schema中所有外鍵名稱然后拼接生成刪除語句 第一步&#xff1a; SELECT CONCAT(ALTER TABLE ,TABLE_SCHEMA,.,TABLE_NAME, DROP FOREIGN KEY ,CONSTRAINT_NAME, ;) FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA數據庫名…

Vue 跨域代理設置

Vue CLI允許你通過項目根目錄下的vue.config.js文件來定制devServer的配置。以下是一些常見的配置示例&#xff1a; module.exports {devServer: {// 跨域代理配置&#xff0c;解決開發環境API跨域問題proxy: {//匹配以api路徑請求的URL&#xff0c;轉發請求的服務器地址/api…

課時135:awk實踐_邏輯控制_綜合實踐

1.3.8 綜合實踐 學習目標 這一節&#xff0c;我們從 網絡實踐、文件實踐、小結 三個方面來學習 網絡實踐 簡介 所謂的網絡實踐&#xff0c;主要是借助于awk的數組功能&#xff0c;進行站點的信息統計操作。準備網絡環境 安裝軟件 yum install nignx -y重啟nginx [rootloca…

Linux修煉之路之自動化構建工具,進度條,gdb調試器

目錄 一&#xff1a;自動化構建工具make/makefile 生成內容&#xff1a; 清理內容&#xff1a; 對于多過程的&#xff1a; 對于多次make&#xff1a; 特殊符號&#xff1a; 二&#xff1a;小程序之進度條 三&#xff1a;git的簡單介紹 四&#xff1a;Linux調試器gdb 接…

fpga 提高有什么進階書推薦?

到FPGA中后期的時候就要開始接觸&#xff0c;如&#xff1a;高速接口、光纖數字信號處理等項目實踐了&#xff0c;那么我們可以讀一些書進行提升&#xff0c;大家可以收藏下。 高速接口項目《嵌入式高速串行總線技術:基于FPGA實現與應用》作者&#xff1a;張鋒 FPGA提升書籍推…

Go團隊:Go是什么

2024年的Google I/O大會[1]如期而至。 這屆大會的核心主旨毫無疑問是堅定不移的以AI為中心&#xff1a;Google先是發布了上下文長度將達到驚人的200萬token的Gemini 1.5 Pro[2]&#xff0c;然后面對OpenAI GPT-4o的挑釁&#xff0c;谷歌在大會上直接甩出大殺器Project Astra[3]…

第七節 ConfigurationClassParser 源碼分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要類。 本章主要是源碼理解&#xff0c;有難度和深度&#xff0c;也枯燥乏味&#xff0c;可以根據實際情況選擇閱讀。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…

[LLM-Agents]淺析Agent工具使用框架:MM-ReAct

上文LLM-Agents]詳解Agent中工具使用Workflow提到MM-ReAct框架&#xff0c;通過結合ChatGPT 與視覺專家模型來解決復雜的視覺理解任務的框架。通過設計文本提示&#xff08;prompt design&#xff09;&#xff0c;使得語言模型能夠接受、關聯和處理多模態信息&#xff0c;如圖像…

winform在一個類中調用窗體的控件和方法的兩個方式

第一: 在類中創建窗體對象的方式&#xff0c;通過對象調用控件或方法 eg: Form1 form1 new Form1(); form1.Button; //調用控件 form1.Method(); //調用方法 要注意&#xff0c;對應控件的Modifiers屬性要設置成public . 第二: 在窗體Form類下定義靜態變量(例如:form1)&…

Multi-Attention Transformer for Naturalistic Driving Action Recognition

標題&#xff1a;用于自然駕駛行為識別的多注意力Transformer 源文鏈接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023W/AICity/papers/Dong_Multi-Attention_Transformer_for_Naturalistic_Driving_Action_Recognition_CVPRW_2023_paper.pdfhttps://openaccess…

linux創建私有docker倉庫以及推拉

創建私有倉庫&#xff1a; 1.下載 registry鏡像。 2.執行 registry 鏡像&#xff08;#為注釋內容&#xff0c;\為換行&#xff09;&#xff1a; docker run -d \# --restartalways每次都是開機自動啟動--restartalways \# --name registry 表示容器名--name registry \# 表示…

java讀取shp文件,獲取點位

Testvoid contextLoads() {System.out.println(System.currentTimeMillis());//1716516228057 1716516228798String zipFilePath "C:\\code\\risk\\risk_management_backend\\edatope-app\\src\\main\\resources\\新中心范圍SHP導入模板.zip";String destDir &quo…

【Muduo】TcpServer類

TcpServer統領之前所有的類&#xff0c;是用戶直接使用的類。它通過ThreadPool管理所有的loopthread&#xff0c;保存所有的TcpConnection&#xff0c;保存用戶提供的各種回調函數并向TcpConnection的Channel中注冊回調。它負責監聽指定的端口&#xff0c;并接受來自客戶端的連…

ZeRO-3、模型并行、流水線并行適用情況

ZeRO-3 適用場景&#xff1a;參數量大但計算量相對均衡的情況。 主要特點&#xff1a; 參數分片&#xff1a;將模型參數、優化器狀態和梯度在多個 GPU 上進行分片。顯存優化&#xff1a;顯著減少每個 GPU 上的顯存占用&#xff0c;使得可以在較小的 GPU 上訓練更大的模型。 …

思科模擬器--06.單臂路由升級版--多端路由互連實驗--24.5.20

實驗圖紙如下: 第0步: 先放置六臺個人電腦,一臺交換機和一臺2911路由器(千兆路由器(G0開頭的)) 接著,用直通線將 PC0的F0,PC1的F0分別和交換機的F0/0, F0/1連接 交換機的F0/3和路由器的G0/0連接 PC2的F0,PC3的F0分別和交換機的F0/4, F0/5連接 交換機的F0/6和路由器的G0/1…

電腦連接愛快iKuai軟路由之后,網卡沒有正常獲取到IP,無法訪問愛快路由管理頁?

前言 上一次咱們說到在愛快控制臺上設置/辨認lan口&#xff0c;設置完成之后&#xff0c;其他的一些設置就需要在愛快iKuai軟路由的管理頁面上設置。 有些小伙伴會發現&#xff0c;當電腦連接上愛快軟路由的lan口之后&#xff0c;電腦并沒有正常獲取到ip&#xff0c;導致無法訪…

JavaScript表達式和運算符

表達式 表達式一般由常量、變量、運算符、子表達式構成。最簡單的表達式可以是一個簡單的值。常量或變量。例&#xff1a;var a10 運算符 運算符一般用符號來表示&#xff0c;也有些使用關鍵字表示。運算符由3中類型 1.一元運算符&#xff1a;一個運算符能夠結合一個操作數&…