日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

设计一个带有getmin功能的栈,保证时间复杂度在O(1)

發布時間:2025/6/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计一个带有getmin功能的栈,保证时间复杂度在O(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2017-06-22? 20:56:10

需要得到最小值,最簡單的思路就是遍歷一遍求出最小值。但是這樣的時間復雜度會是O(n),不滿足O(1)的要求。于是想到在建立一個棧來保存最小值。

具體操作是建立兩個棧,一個存放數據,一個存放最小值。

push:首先將數據壓入數據棧,若最小值棧為空,則將之壓入最小值棧,若最小值棧非空,則需要比較它和最小值棧的頂部數據,若小于等于,則將之壓入。這里用到的思想就是,如果當前壓入的數據比最小值大,那么目前數據棧的最小值就是最小值棧的棧頂元素,反之則需要將之壓入;

pop:將數據棧的元素彈出時需要比較他和最小值棧的棧頂元素大小,若等于的話,也需要將最小值棧的棧頂元素pop出來;

getmin:只需要將最小值棧的棧頂元素返回即可。

1 class Mystack2 {3 stack<int> s1;4 stack<int> mins;5 6 public:7 void pop()8 {9 if(s1.empty()) {cout<<"棧空\n"; return;} 10 else 11 { 12 int temp = s1.top(); 13 if(temp == mins.top()){mins.pop();} 14 s1.pop(); 15 } 16 } 17 18 void push(int key) 19 { 20 if(mins.empty()) {mins.push(key);cout<<"mins "<<key<<endl;s1.push(key);} 21 else 22 { 23 if(mins.top() >= key) {mins.push(key);cout<<"mins "<<key<<endl;} 24 s1.push(key); 25 } 26 } 27 28 void getmin() 29 { 30 if(mins.empty()) {cout<<"當前棧為空\n";} 31 else cout<<mins.top()<<endl; 32 } 33 }

還有一種只采用一個棧就能解決的方法,具體步驟是遇到小于等于當前最小值的數,也就是會改變最小值的數,將當前最小值壓棧,并修改最小值,然后將當前數壓棧,否則直接壓棧。

在pop的時候需要對當前的pop出的數值進行判斷,如果等于最小值,那么意味著,最小值將會被,改變所以需要pop兩次。

public class MinStack {Stack<Integer> s;int min;/** initialize your data structure here. */public MinStack() {s = new Stack<>();min = Integer.MAX_VALUE;}public void push(int x) {if(x <= min) {s.add(min);min = x;}s.add(x);}public void pop() {if(s.pop() == min) min = s.pop();}public int top() {return s.peek();}public int getMin() {return min;} }

?

轉載于:https://www.cnblogs.com/TIMHY/p/7067173.html

總結

以上是生活随笔為你收集整理的设计一个带有getmin功能的栈,保证时间复杂度在O(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。