【左程云算法筆記016】雙端隊列-雙鏈表和固定數組實現

目錄

1)雙端隊列的介紹

2)雙端隊列用雙鏈表的實現代碼演示

3)雙端隊列用固定數組的實現

代碼演示


視頻

【算法講解016【入門】雙端隊列-雙鏈表和固定數組實現】

Leecode

leecode641 設計循環雙端隊列


1)雙端隊列的介紹

可以從頭部進,可以從頭部出;也可以從尾部進,可以從尾部出。這種結構叫雙端隊列

雙向鏈表為了跳轉容易,在數外邊設置一個節點包著,前指針,后指針。

比如我之前有個a,頭指空,尾指空。

我現在又加了個b,那么b的頭指針指向a,尾指針指向空,尾巴來到b上

我再加個c,一樣的。我又想在頭部加個d,一樣思路所以頭部加數 尾部加數就會了

頭部彈出 尾部彈出怎么辦?

頭部彈出

頭移到a,a的前指針指向null,c或c++的同學把d釋放掉,java會自己釋放不用管。

同樣方法把a彈出。

想從尾部彈出呢?

尾巴向前跳一個,讓b的next指針指向空。c或c++的同學把d釋放掉,java會自己釋放不用管。

2)雙端隊列用雙鏈表的實現代碼演示

package C16;import java.util.Deque;
import java.util.LinkedList;public class Video_016_Deque {class MyCircularDeque1{//Deque是接口 <Integer>是泛型,相當于Deque<Integer> 的意思就是:“這是一個雙端隊列,并且我給它貼上了**‘只能存放整數 (Integer)’**的標簽。”public Deque<Integer> deque = new LinkedList<>();//“我要聲明 (declare) 一個變量,它的名字叫 deque。這個變量是 public(公開)的,并且它的類型是一個貼著 Integer(整數)標簽的 Deque(雙端隊列功能清單)。”public int size;public int limit;/*** 初始化一個容量為k的雙端隊列* @param k 隊列的容量*/public MyCircularDeque1(int k){//“現在,我要創建一個真正能干活的工人(new LinkedList<>()),這個工人完全遵守了 Deque 的規范,然后讓我的 deque 變量去管理(指向)這個工人。”deque = new LinkedList<>();//初始時,隊列中沒有元素size = 0;//設置容量上限limit = k;}/*** 將一個元素添加到隊首,如果操作成功,返回true*/public boolean insertFront(int value) {//在插入前檢查隊列是否已滿if(isFull()){return false;//滿了,添加失敗}//調用LinkList自帶的方法offerFirst(),它會高效地將元素添加到鏈表頭部deque.offerFirst(value);//元素數量加1size++;//插入成功return true;}/*** 將一個元素添加到隊尾,如果操作成功返回true*/public boolean insertLast(int value){//同樣先檢查隊列是否已經滿了if(isFull()){return false;}//調用自帶的方法offerLast(),它會高效地將元素添加到鏈表尾部deque.offerLast(value);size++;return true;}/*** 從隊首刪除一個元素,如果操作成功返回true*/public boolean deleteFront(){//跟之前一樣的操作if(isEmpty()){return false;}deque.pollFirst();size--;return true;}public boolean deleteLast(){if(isEmpty()){return false;}deque.pollLast();size--;return true;}/*** 從隊首獲取元素,如果隊列為空返回-1*/public  int getFront(){if (isEmpty()) {return -1;}// 調用 LinkedList 自帶的 peekFirst(),它只查看頭部的元素,不移除。return deque.peekFirst();}/*** 獲取隊尾元素。如果隊列為空,返回 -1。* @return 隊尾的元素,或 -1。*/public int getRear() {if (isEmpty()) {return -1;}// 調用 LinkedList 自帶的 peekLast(),它只查看尾部的元素,不移除。return deque.peekLast();}/*** 檢查雙端隊列是否為空。* @return 為空返回 true,否則返回 false。*/public boolean isEmpty() {// 我們自己維護了 size 變量,用它來判斷最簡單。return size == 0;}/*** 檢查雙端隊列是否已滿。* @return 已滿返回 true,否則返回 false。*/public boolean isFull() {// 當 size 達到容量上限時,隊列就滿了。return size == limit;}}
}

3)雙端隊列用固定數組的實現

用固定數組(動態也可以)

size,l,r

有沒有數字或者滿沒滿,size管。如果size等于0,那么l和r等于啥都沒意義。

當加入數字a時,把a放在第零位,l到r位置上放a。即第零位到第零位放a。size變為1。

再加入b,r變為第一位。size再加1。

再加c

再加d。

頭部再加個e。

怎么做?

l已經在第零位了,怎么辦?

加到最后的位置上。

一共不是k位嗎?這道題k是10,所以l來到第k-1位置上,即第9位。所以說總結頭部添加的辦法:當l==0時,放在第k-1位,l=k-1;

當l≠0時,放在第l-1位,l--。

比如再在頭部加個f所以現在從頭部到尾部的就是890123這樣的順序。

如果再在頭部加個g彈出呢?

從頭部彈出,也就是l往右竄。即總結為:頭部加數那么l往左竄,頭部彈數則l往右竄。這就是l的邏輯。

模擬一下全過程

原來是這樣

彈出g

彈出f彈出e..

彈出a

彈出b

?

加入k加入s,加入p,加入l,加入n...

在尾部加入M

所以現在的整個隊列就是cdkspcznm

從尾巴彈出總結一下:

從頭部加入,l向左走,如果l==0,把數放在k-1的位置,然后賦值l=k-1;

如果l≠0,那么把數放在l-1的位置,然后賦值l--;

從頭部出,首先給用戶l位置的數[l],如果l==k-1,那么賦值l=0;

如果l≠k-1,那么賦值l++;

從尾部入,如果l==k-1,把數放在0的位置,然后賦值r=0;

如果r≠k-1,那么把數放在r+1的位置,然后賦值r++;

從尾出,首先給用戶r位置的數[r],然后要往左走,所以如果r==0,那么r賦值為k-1,即第k-1位;

如果r≠0呢?從尾出那么就是r--就行了。

這就是所有的邏輯 環形雙端隊列

代碼演示

public class MyCircularDeque2 {//底層的數據容器,一個固定大小的數組public  int[] deque;//l:left/front指針,指向隊頭元素所在的索引//r:right/rear指針,指向隊尾元素所在的索引//size:當前隊列中的元素數量//limit:隊列的容量上限(數組的大小)public int l,r,size,limit;/*** 構造方法:初始化一個容量為k的雙端隊列*/public MyCircularDeque2(int k){//創建一個能容納k個整數的數組deque = new int[k];//初始時,所有指針和計數器都為0(或者一個無效狀態)l = r = size = 0;//設置容量上限limit = k;}/*** 將一個元素添加到隊首*/public boolean insertFront(int value){//先檢查是否已經滿if(isEmpty()){//隊頭和隊尾指針都指向0號位置l = r = 0;//在0號位置放入新元素deque[0] = value;}else{//如果不為空,我們需要l往左移動,但如果它本來就在最左邊,所以我們將它移動到limit-1位置上l = l ==0?(limit - 1):(l - 1);//在計算出的新位置l放入元素deque[1] = value;}//元素數量加1size++;return true;}/*** 將一個元素添加到隊尾。*/public boolean insertLast(int value) {if (isFull()) {return false;}if (isEmpty()) {// 和 insertFront 一樣,第一個元素 l 和 r 都指向 0l = r = 0;deque[0] = value;} else {// 移動 r 指針,為新元素在“后面”騰出位置// 這是另一個“循環”的關鍵!// r == limit - 1 ? 0 : (r + 1)// 意思是:// 如果 r 指針已經在末尾了 (limit - 1),那么它的“后一個”位置就是環繞到開頭的 0。// 否則,它的后一個位置就是 r + 1。r = r == limit - 1 ? 0 : (r + 1);// 在計算出的新位置 r 放入元素deque[r] = value;}size++;return true;}/*** 從隊首刪除一個元素。*/public boolean deleteFront() {if (isEmpty()) {return false;}// 刪除隊首元素,我們只需要把 l 指針向“后”移動一位即可// 同樣是循環移動// l == limit - 1 ? 0 : (l + 1)// 意思是:如果 l 在末尾,下一個位置是 0;否則是 l + 1l = l == limit - 1 ? 0 : (l + 1);// 元素數量減 1size--;return true;}/*** 從隊尾刪除一個元素。*/public boolean deleteLast() {if (isEmpty()) {return false;}// 刪除隊尾元素,我們只需要把 r 指針向“前”移動一位// 循環移動// r == 0 ? (limit - 1) : (r - 1)// 意思是:如果 r 在開頭,前一個位置是 limit - 1;否則是 r - 1r = r == 0 ? (limit - 1) : (r - 1);size--;return true;}/*** 從隊首獲取元素。*/public int getFront() {if (isEmpty()) {return -1;}// 隊首元素就是 l 指針指向的元素return deque[l];}/*** 獲取隊尾元素。*/public int getRear() {if (isEmpty()) {return -1;}// 隊尾元素就是 r 指針指向的元素return deque[r];}public boolean isEmpty() {return size == 0;}public boolean isFull() {return size == limit;}}

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

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

相關文章

ffplay視頻輸出和尺寸變換

視頻輸出模塊 視頻輸出初始化的主要流程 我們開始分析視頻&#xff08;圖像&#xff09;的顯示。 因為使?了SDL&#xff0c;?video的顯示也依賴SDL的窗?顯示系統&#xff0c;所以先從main函數的SDL初始化看起&#xff08;節選&#xff09;&#xff1a; int main(int argc, c…

協議_https協議

http http協議是將數據以明文的形式在網絡上傳輸。若是傳輸的數據中包含一些敏感信息比如銀行卡信息等可能會被有心人攻擊造成信息泄露或被篡改。 總結&#xff1a;http協議進行數據傳輸難以保證數據的隱私性以及數據完整性&#xff0c;為了保證數據的準確定引入了https這一協…

阿里云 騰訊云 API 自動化查詢指南

文章目錄一、核心思路與架構建議二、經驗與核心建議三、技術方案選型建議四、API使用詳解4.1 阿里云4.2 騰訊云五、進階&#xff1a;與內部系統聯動免費個人運維知識庫&#xff0c;歡迎您的訂閱&#xff1a;literator_ray.flowus.cn 一、核心思路與架構建議 自動化流程可以概括…

【Unity 性能優化之路——概述(0)】

Unity性能優化概述性能優化不是某個環節的極致壓榨&#xff0c;而是所有模塊的協同共進。本文將為你建立完整的Unity性能優化知識體系。很多Unity開發者一提到性能優化&#xff0c;首先想到的就是Draw Call、Batches這些渲染指標。這沒錯&#xff0c;但它們只是性能優化中的一部…

靈碼產品演示:軟件工程架構分析

作者&#xff1a;了哥 演示目的演示靈碼對于整個復雜軟件工程項目的架構分析能力&#xff0c;輸出項目的軟件系統架構圖。演示文檔接口生成能力。演示準備 克隆工程地址到本地&#xff08;需提前安裝好 git 工具&#xff0c; 建議本地配置 brew&#xff09;&#xff1a; git cl…

銀河麒麟部署mysql8.0并連接應用

?客戶需在國產化銀河麒麟系統中部署軟件應用&#xff0c;使用mysql8.0數據庫。機器放置了兩三年&#xff0c;里面命令工具和依賴都不太全。而且客戶環境不聯網&#xff0c;只能采用離線部署的方式。部署過程中踩了很多坑&#xff0c;也用到很多資源&#xff0c;記錄一下。 過…

GitAgent-面壁智能聯合清華大學發布的大模型智能體應用框架

本文轉載自&#xff1a;https://www.hello123.com/gitagent ** 一、&#x1f50d; GitAgent 框架&#xff1a;大模型智能體的工具箱革命 GitAgent 是由面壁智能與清華大學自然語言處理實驗室聯合研發的創新型框架&#xff0c;旨在解決大模型智能體在復雜任務中的工具擴展瓶頸…

靈碼產品演示:Maven 示例工程生成

作者&#xff1a;輕眉 演示主題&#xff1a;由 AI 自動生成 0 到 1 的電商訂單 Java 項目 演示目的 面向 Java 零基礎的用戶&#xff0c;通過靈碼的產品能力&#xff08;如提示詞、編碼智能體、項目 Rules 和 SQLite MCP 服務、單元測試&#xff09;自動生成 0 到 1 的電商訂單…

AI編程從0-1開發一個小程序

小伙伴們&#xff0c;今天我們利用AI實現從0到1開發一個小程序&#xff01;需求交給AI&#xff1a; 我們只要說出自己的開發思路&#xff0c;具體需求交給AI完成&#xff01;輸入提示詞&#xff1a;個人開發的小程序 能開發哪些好備案&#xff0c;用戶喜歡使用的 AI給出…

DDoS高防IP是什么? DDoS攻擊會暴露IP嗎?

DDoS高防IP是什么&#xff1f;高防IP是指一種網絡安全服務&#xff0c;主要用于防御DDoS攻擊。隨著技術的發展&#xff0c;黑客進行網絡攻擊的強度也在加大&#xff0c;所以我們要做好網絡防護&#xff0c;及時預防DDoS攻擊。DDoS高防IP是什么&#xff1f;DDoS高防IP是指基于IP…

k8s事件驅動運維利器 shell operator

Shell-Operator 概述 Shell-Operator 是 Kubernetes 的一個工具&#xff0c;用于通過 shell 腳本擴展集群功能。它允許用戶編寫簡單的腳本&#xff08;Bash、Python 等&#xff09;來響應 Kubernetes 事件&#xff08;如資源變更、定時任務&#xff09;&#xff0c;無需編譯復…

(二)文件管理-文件權限-chmod命令的使用

文章目錄1. 命令格式2. 基本用法2.1 符號模式2.2 八進制數字模式3. 高級用法3.1 遞歸操作3.2 參考權限3.3 特殊權限位(Setuid, Setgid, Sticky Bit)3.4 X 特殊執行權限4. 注意事項4.1權限與所有權4.2 Root 權限4.3 安全風險4.4 -R 的風險4.5 目錄的執行權限1. 命令格式 chmod …

醫院預約掛號腳本

醫院預約掛號腳本 功能介紹 本腳本是一個用 Python 編寫的醫院預約掛號程序&#xff0c;支持以下功能&#xff1a; 自動預約&#xff1a;通過api交互選擇醫院、科室、醫生和時間段。自動監控&#xff1a;持續檢查指定醫生的號源狀態&#xff0c;發現可預約時段時自動嘗試預約。…

.NET駕馭Word之力:理解Word對象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word庫進行Word文檔自動化處理時&#xff0c;深入理解Word對象模型的核心組件是至關重要的。Word對象模型提供了一套層次化的結構&#xff0c;使開發者能夠通過編程方式控制Word應用程序、文檔以及文檔內容。本章將詳細介紹Word對象模型中最核心的…

Kotlin在醫療大健康域的應用實例探究與編程剖析(上)

一、引言 1.1 研究背景與意義 在當今數字化時代,醫療行業正經歷著深刻的變革。隨著信息技術的飛速發展,尤其是人工智能、大數據、物聯網等新興技術的廣泛應用,醫療行業數字化轉型已成為必然趨勢。這種轉型旨在提升醫療服務的效率和質量,優化醫療資源配置,為患者提供更加…

AI智能體的應用前景

AI智能體的應用前景正從技術探索邁向規模化落地的關鍵階段,其發展動力源于大模型能力的突破、行業需求的深化以及商業化模式的創新。以下是基于最新技術動態和行業實踐的深度解析: 一、技術突破:從「有腦無手」到「知行合一」 大模型的進化顯著提升了智能體的多模態交互與…

高系分四:網絡分布式

目錄一、我的導圖和思考二、大模型對我導圖的評價優點可優化之處三、大模型對這章節的建議一、網絡知識范疇&#xff08;一&#xff09;網絡基礎理論&#xff08;二&#xff09;局域網與廣域網&#xff08;三&#xff09;網絡安全&#xff08;四&#xff09;網絡性能優化&#…

Day24_【深度學習(1)—概念】

一、AI、ML、DL基本關系 機器學習是實現人工智能的途徑&#xff0c;深度學習是機器學習的一種方法。人工智能 (AI)↓ 機器學習 (ML) —— 讓機器從數據中學習規律↓ 深度學習 (DL) —— 使用深層神經網絡的機器學習方法二、深度學習與機器學習概念深度學習&#xff08;Deep Lea…

VTK基礎(01):VTK中的基本概念

VTK中的基本概念 1.三維場景中的基本要素 三維場景的基本要素包含&#xff1a;燈光、相機、顏色和紋理映射 (1)燈光vtkLight 光的本質是特定頻段的電磁波&#xff0c;所以燈光的本質是特定頻段&#xff08;可見光頻段&#xff09;的電磁波發射器&#xff1b;依據發射可見光頻段…

LeetCode 2348.全0子數組的數目

給你一個整數數組 nums &#xff0c;返回全部為 0 的 子數組 數目。 子數組 是一個數組中一段連續非空元素組成的序列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,3,0,0,2,0,0,4] 輸出&#xff1a;6 解釋&#xff1a; 子數組 [0] 出現了 4 次。 子數組 [0,0] 出現了 2 次。…