---
# System prepended metadata

title: 'Leetcode [No. 155] Min Stack (MEDIUM) 解題心得'
tags: [leetcode]

---

# Leetcode [No. 155] Min Stack (MEDIUM)

+ Blind169: Solved on 2024/02/09

## 題目

https://leetcode.com/problems/min-stack/description/

## 思路
+ 這個解法非常trivial，因此時間複雜度也很高，花最多的時間就是在getMin()需要去花O(n)的時間來得到，實在太沒效率。


```c++=
class MinStack {
public:
    MinStack() {
    }
    
    void push(int val) {
        arr.emplace_back(val);
    }
    
    void pop() {
        arr.pop_back();
    }
    
    int top() {
        return arr[arr.size()-1];
    }
    
    int getMin() {
        return *min_element(arr.begin(),arr.end());
    }
private:
    vector<int> arr;
};
```

### 解法分析
+ time complexity: O(nlgn)


### 執行結果
![image](https://hackmd.io/_uploads/Hy9RcD7jT.jpg)


## 改良:

+ 不使用`*min_element`來取得最小的值，改用其他方法。
    + 改用一個vector去紀錄當前index的最小值，如：
    + arr: 1,2,3,4,5
    + minArr: 1,1,1,1,1

```C++=
class MinStack {
public:
    MinStack() {
    }
    
    void push(int val) {
        if(arr.empty())
        {
            arr.emplace_back(val);
            minArr.emplace_back(val);
        }
        else
        {
            arr.emplace_back(val);
            minArr.emplace_back(min(minArr.back(),val));
        }
    }
    
    void pop() {
        minArr.pop_back();
        arr.pop_back();
    }
    
    int top() {
        return arr[arr.size()-1];
    }
    
    int getMin() {
        return minArr.back();
    }
private:
    vector<int> arr;
    vector<int> minArr; // this array is used to store the min value in current index
};
```

### 解法分析
+ time complexity: O(1)

### 執行結果
![image](https://hackmd.io/_uploads/BkW6euQo6.jpg)
