1. 程式人生 > 遊戲攻略 >《鬼谷八荒》煉器版本雷修功法搭配推薦

《鬼谷八荒》煉器版本雷修功法搭配推薦

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. 結語

  努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!

  如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。

但行好事 莫問前程