《鬼谷八荒》煉器版本雷修功法搭配推薦
阿新 • • 發佈:2021-07-10
1. 題目
定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min、push 及 pop 的時間複雜度都是 O(1)。
2. 示例
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
來源:力扣(LeetCode)
連結:https: //leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
3. 題解
本題主要是要看懂要做什麼?
是讓我們實現一個函式來做棧的相關操作。
兩種實現方式:
- 雙棧:
- 其中一個保持預設棧的方式,另外一個作為非嚴格降序輔助棧(並不包含所有元素)。
- push:A棧始終入棧,B棧判斷是否為空或者即將入棧元素是否小於棧頂元素,若是,直接入棧。此時,對於大於棧頂的元素未入B棧,但沒有影響,因為只需返回最小元素。
- pop:彈出A棧棧頂元素,判斷彈出元素是否與B棧頂想等,若是,B棧也彈出。
- top:直接返回A棧棧頂元素。
- min:返回B棧棧頂元素。
- 單棧
- 分析上面雙棧方式,發現雙棧中的輔助站只是為了儲存歷次的最小值min,但實際在使用過程中,我們只需要維護當前的最小值以及上一次的最小值即可,因而我們可以之際使用單棧來實現。
- 當前的最小元素為min,上一次的最小元素存入單棧中。
4. 實現
4.1 雙棧
1 class MinStack {
2
3 //維護一個棧,只需要維護當前最小值以及上一次最小值即可
4 Stack<Integer> stack;
5 int min;
6 /** initialize your data structure here. */
7 public MinStack30() {
8 stack = new Stack<>();
9 }
10 public void push(int x) {
11 if(stack.isEmpty()) {
12 min = x;
13 }
14 if(x <= min) {
15 // 記錄上一個最小值
16 stack.push(min);
17 min = x;
18 }
19 stack.push(x);
20 }
21 public void pop() {
22 if(min == stack.pop()) {
23 // 還原上一個最小值
24 min = stack.pop();
25 }
26 }
27 public int top() {
28 return stack.peek();
29 }
30 public int min() {
31 return min;
32 }
33 }
View Code
4.2 單棧
1 public class MinStack {
2 // 維護一個棧,只需要維護當前最小值以及上一次最小值即可
3 Stack<Integer> stack;
4 int min;
5 /** initialize your data structure here. */
6 public MinStack() {
7 stack = new Stack<>();
8 }
9 public void push(int x) {
10 if(stack.isEmpty()) {
11 min = x;
12 }
13 // 此處很巧妙,將min入棧,保證min之下都比這個元素小
14 if(x <= min) {
15 // 記錄上一個最小值
16 stack.push(min);
17 min = x;
18 }
19 stack.push(x);
20 }
21 public void pop() {
22 if(min == stack.pop()) {
23 // 還原上一個最小值, stack.push(min)將最小元素儲存在了stack裡
24 min = stack.pop();
25 }
26 }
27 public int top() {
28 return stack.peek();
29 }
30 public int min() {
31 return min;
32 }
33 }
View Code
5. 結語
努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!
如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。
但行好事 莫問前程