【左程云算法09】棧的入門題目-最小棧

目錄

棧的入門題目-最小棧

代碼演示


視頻鏈接

算法講解015【入門】棧的入門題目-最小棧

Leecode155

棧的入門題目-最小棧

實現一個getmin方法(高效方法,即不用遍歷),希望能實現O(1)

做法:準備兩個棧

data和min棧

當我壓入3時,我同步壓入。如果再加入個5,data棧壓入5。讓最小棧的棧頂和要壓入的數比較。3<5,所以min棧再壓入5。

比如再壓入2,2現在是最小的,所以左右同時壓入2。

比如再壓入7,2目前還是最小的,所以左邊壓入7,右邊壓入2。

總結:就這三條邏輯1)當前壓的數字<=min棧的頂,當前數字壓入min棧

2)當前壓得數字>min棧的頂,min原來的數壓入min棧

3)min棧為空,data為空,當前要壓的數字壓入min棧

為什么要這么做?

保證一一對應。即永遠右邊的棧頂是棧里元素的最小值。

要彈出的時候,data棧和min棧同步彈出就行

代碼演示

import java.util.Stack;
public class MinStack1 {//data棧:用于存放所有實際的數字public Stack<Integer>data;//min棧:輔助棧,其棧頂永遠是當前data棧中的最小值public Stack<Integer>min;//構造方法:public MinStack1(){//初始化兩個棧data = new Stack<Integer>();min = new Stack<Integer>();}/*** 將一個元素推入棧中*/public void push(int val){//第一步:無論如何,新元素val總是要被推入data棧data.push(val);//第二步:根據規則決定往min棧中推入什么//條件一:min棧為空?(即這是第一個元素,它當然是最小值)//條件二:val<=min.peek()? 如果是的話,那么目前val最小,val壓入到min棧中。//條件一條件二都是將val直接壓入min棧中if(min.isEmpty()||val<=min.peek()){min.push(val);}else{//如果是條件三:即min.peek比val要小,那么再把它壓一遍min.push(min.peek());}}/*** 從棧中彈出一個元素*/public void pop(){//data棧和min棧是嚴格同步的,所以data棧彈出時min棧也應該彈出,以維持同步data.pop();min.pop();}/*** 查看棧頂元素*/public int top(){//棧頂元素就是data棧的棧頂return data.peek();}/*** 獲取棧的最小元素*/public int getMin() {//即min的peekreturn min.peek();}
}

但這種方法(即用java自帶的stack類效率低),所以我們選擇用數組來親手搭建一個棧,這樣效率高。

public class MinStack2 {//假設這個棧最多裝8001個元素public final int MAXN = 8001;//用兩個整型數組來代替stack類public int[]data;//對應之前的data棧public int[]min;//對應之前的min棧//變量size:即表示當前元素的數量,也指向下一個要插入的位置int size;//構造方法public MinStack2(){//創建兩個剛好能容納MAXN個整數的數組//相當于建好了兩怕空的儲物柜data = new int[MAXN];min = new int[MAXN ];//初始時一個元素都沒有所以size是0size = 0;}/*** 將一個元素推入我們用數組模擬的棧中*/public void push(int val){//data[size] = val//把新元素val放入data數組的第size個位置//如果size是0,就放在data[0];如果size是1,就放在data[1]data[size] = val;//data棧壓入之后,我們來想一想min棧怎么辦(和上一題一樣)if(size == 0||val<=min[size-1]){min[size] = val;}else{//否則,最小值不變//復制上一個位置的最小值到當前位置,以保持和data數組的同步min[size] = min[size-1];}//最重要的一步:把size加1,讓指針指向下一個空位//并且表示元素總數增加一個size++;}/*** 從我們用數組模擬的棧中彈出一個元素*/public void pop(){//我們不需要真的去清除數組里的data[size-1]//只需要把size減1,就等于我們邏輯上拋棄了最后一個元素//下次push時,那個位置的值會被自然地覆蓋掉size--;}/*** 查看棧頂元素*/public int top(){//因為size指向地是下一個空位,所以棧真正地頂部元素位于它地前一個位置// 即size-1return data[size-1];}/*** 獲取棧中的最小元素*/public int getMin(){//同理,最小元素即min數組的棧頂位置,也就是size-1return min[size-1];}
}

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

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

相關文章

Grafana與Prometheus實戰

&#x1f31f;Grafana的Dashboard的權限管理 創建團隊 創建用戶 設置團隊權限 &#x1f31f;Prometheus啟用https及認證功能 自建ca的證書 準備證書目錄 mkdir /app/tools/prometheus-2.53.4.linux-amd64/certs cd /app/tools/prometheus-2.53.4.linux-amd64/certs生成ca的…

FPGA交通燈設計報告(源碼+管腳約束+實物圖+設計報告)

基于FPGA的交通燈設計 摘要 本設計采用FPGA技術實現了一個智能交通燈控制系統。系統以Verilog HDL為設計語言,在FPGA平臺上實現了交通燈的自動控制、數碼管倒計時顯示、緊急情況處理等功能。通過合理的狀態機設計和模塊化編程,系統具有良好的實時性、可靠性和可擴展性,能夠…

技術論文分析分析論文《計算機病毒判定專家系統原理與設計》思考其在游戲中的應用

論文原文的引言主要有兩大部分的內容&#xff1a;介紹計算機病毒&#xff0c;明確本文使用的病毒分類方式&#xff1b;分析傳統計算機病毒檢測存在的弊端。對于計算機病毒的定義&#xff0c;文中給出的定義比較嚴謹&#xff0c;我自己查了一下現在百度百科的定義&#xff0c;兩…

《Unity項目實戰:動態加載引發的顯存危機全鏈路排查與重構實踐》

從動態光影那流光溢彩、仿佛賦予虛擬世界真實質感的絢麗效果—這得益于Unity引擎強大的HDRP管線對光照路徑的精準模擬,到物理引擎驅動的物體碰撞精準到毫厘的物理反饋—依托Unity Physics模塊對剛體動力學的毫秒級計算,再到能夠依據不同設備性能自動適配的畫質表現—通過Unit…

智慧水庫綜合管理系統平臺御控物聯網解決方案

一、行業背景與痛點分析水庫作為防洪、灌溉、供水、發電及生態保護的核心基礎設施&#xff0c;其管理效率直接關系到區域水資源安全與可持續發展。然而&#xff0c;傳統水庫管理模式存在四大核心痛點&#xff1a;數據孤島嚴重&#xff1a;水位、雨量、水質、設備狀態等數據分散…

使用nvm安裝Node.js18以下報錯解決方案——The system cannot find the file specified.

使用 nvm 安裝 Node.js 18以下 報錯解決方案 在前端開發過程中&#xff0c;常常需要針對不同項目切換 Node.js 版本。nvm&#xff08;Node Version Manager&#xff09;是最常用的工具。但最近在嘗試安裝 Node.js 14 版本時&#xff0c;遇到了奇怪的錯誤。 問題描述 使用 nv…

在Excel和WPS表格中快速復制上一行內容

有的時候我們在Excel和WPS表格中想復制上一行對應單元格、連續區域或整行的內容&#xff0c;只需要在當前行拖動鼠標左鍵選中相關區域&#xff0c;然后按CtrlD鍵即可將上一行對應位置的內容復制過來——需要注意的是&#xff0c;如果當前行有數據&#xff0c;這些數據會直接被覆…

408學習之c語言(遞歸與函數)

今天主要學習了遞歸與函數的相關內容&#xff0c;下面將我今天所學知識與所寫代碼分享給大家 遞歸核心要點 遞歸三要素 基準條件&#xff08;明確終止條件&#xff09; 遞歸調用&#xff08;逐步分解問題&#xff09; 收斂性&#xff08;確保每次遞歸都向基準條件靠近&#xff…

swVBA自學筆記016、Solidworks API Help 幫助文檔的(三大版塊)

目錄1. Namespace (命名空間) 版塊2. Interface (接口) 版塊3. Members (接口成員) 版塊4、總結關系5、如果你感覺上面說的過于簡單&#xff0c;請往下看!6、示例鏈接→SOLIDWORKS API Help 20197、需要注意的是&#xff0c;帶“I”的對象表示&#xff1a;接口1. Namespace (命…

通俗易懂地講解JAVA的BIO、NIO、AIO

理解Java的I/O模型&#xff08;BIO、NIO、AIO&#xff09;對于構建高性能網絡應用至關重要 &#x1f9e0; 通俗理解&#xff1a;快遞站的故事 想象一個快遞站&#xff1a; ? BIO&#xff1a;就像快遞站為每一個包裹都安排一位專員。專員從接到包裹到處理完&#xff08;簽收、…

LabVIEW 泵輪檢測系統

在汽車行業&#xff0c;泵輪作為液力變矩器關鍵部件&#xff0c;其質量檢測極為重要。傳統手工檢測泵輪效率低且誤差大&#xff0c;為此構建基于 LabVIEW 與西門子硬件結合的泵輪檢測系統。 應用場景 聚焦汽車零部件生產車間&#xff0c;對泵輪總成進行出廠前檢測。在液力變矩…

2025年8月月賽 T2 T3

一. 七天假日 T2原思路&#xff1a;直接計算左右括號的數量&#xff0c;然后直接輸出他們的差改進思路&#xff1a; 用d值記錄截止到當前位置&#xff0c;還需要多少個右括號可以滿足非法要求cur&#xff1a;截止到當前位置&#xff0c;已經有多少個右括號sum是右括號位置的前綴…

數據結構----棧的順序存儲(順序棧)

棧的特點&#xff1a;先進后出棧的操作&#xff1a;用數組進行存儲&#xff08;1&#xff09;初始化&#xff1a;//棧 typedef struct {int *data;//指針模擬分配數組int top;//棧“頂”指針 }Stack; //初始化 Stack InitStack(){Stack s;//給數組分配空間s.data (int*)malloc…

React Hooks原理深度解析與高級應用模式

React Hooks原理深度解析與高級應用模式 引言 React Hooks自16.8版本引入以來&#xff0c;徹底改變了我們編寫React組件的方式。然而&#xff0c;很多開發者僅僅停留在使用層面&#xff0c;對Hooks的實現原理和高級應用模式了解不深。本文將深入探討Hooks的工作原理、自定義Hoo…

兼職網|基于SpringBoot和Vue的蝸牛兼職網(源碼+數據庫+文檔)

項目介紹 : SpringbootMavenMybatis PlusVue Element UIMysql 開發的前后端分離的蝸牛兼職網&#xff0c;項目分為管理端和用戶端和企業端。 項目演示: 基于SpringBoot和Vue的蝸牛兼職網 運行環境: 最好是java jdk 1.8&#xff0c;我們在這個平臺上運行的。其他版本理論上也可…

TDengine 聚合函數 LEASTSQUARES 用戶手冊

LEASTSQUARES 函數用戶手冊 函數定義 LEASTSQUARES(expr, start_val, step_val)功能說明 LEASTSQUARES() 函數對指定列的數據進行最小二乘法線性擬合&#xff0c;返回擬合直線的斜率&#xff08;slope&#xff09;和截距&#xff08;intercept&#xff09;。該函數基于線性回…

Redis最佳實踐——安全與穩定性保障之高可用架構詳解

全面詳解 Java 中 Redis 在電商應用的高可用架構設計一、高可用架構核心模型 1. 多層級高可用體系 #mermaid-svg-anJ3iQ0ymhr025Jn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-anJ3iQ0ymhr025Jn .error-icon{fil…

ABAP 屏幕在自定義容器寫多行文本框

文章目錄變量定義容器等邏輯屏幕效果變量定義 CONSTANTS: GC_TEXT_LINE_LENGTH TYPE I VALUE 72. TYPES: TEXT_TABLE_TYPE(GC_TEXT_LINE_LENGTH) TYPE C OCCURS 0. DATA: GV_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER. DATA: GV_CUSTOM_CONTAINER TYPE REF TO CL_…

昆山精密機械公司8個Solidworks共用一臺服務器

在當今高度信息化的制造業環境中&#xff0c;昆山精密機械公司面臨著如何高效利用SolidWorks這一核心設計工具的現實挑戰。隨著企業規模的擴大和設計團隊的分散&#xff0c;傳統的單機授權模式已無法滿足協同設計需求。通過引入云飛云共享云桌面解決方案&#xff0c;該公司成功…

【WebSocket?】入門之旅(三):WebSocket 的實戰應用

本篇文章將通過構建一個簡單的實時聊天應用&#xff0c;演示如何在前端和后端搭建 WebSocket 系統&#xff0c;完成實時消息傳輸。通過實戰&#xff0c;幫助你更好地理解 WebSocket 在實際項目中的應用。 目錄 搭建 WebSocket 服務器WebSocket 客戶端實現實時聊天應用示例常見…