曾格的github

快手一面:Leetcode:最小栈

快手一面的第三个算法题:

方法一:通过一个辅助栈实现在O(1)的时间内返回栈的最小值,但空间复杂度为O(n)

方法二:如何在O(1)的空间复杂度下找出最小值min:栈内不存储val,而是存储val-min

 1 class MinStack {
 2 public:
 3     /** initialize your data structure here. */
 4     // 用一个栈实现:存的是当前值和当前最小值的差值。
 5     // 注意点:随着元素的不断出栈,min值可能变大,所以在min值变大的时候,要及时检测并得到更新的min值
 6     // 如入栈顺序为:1,3,-2,3,4
 7     stack<long long> mystack;
 8     long long min = 0;
 9     MinStack() :min(0) {}
10 
11     void push(long long val) {
12         if (mystack.empty()) {
13             min = val;
14         }
15         mystack.push(val - min);
16         if (val < min) min = val;
17     }
18 
19     void pop() {
20         if(mystack.empty()) return;
21         if (mystack.top() < 0) {  // 删除元素使得min值变大
22             min = min - mystack.top();
23         }
24         mystack.pop();
25     }
26 
27     long long top() {
28         if(mystack.empty()) return 0;
29         if(mystack.top()<0) return min;
30         return mystack.top() + min;
31     }
32 
33     long long getMin() {
34         return min;
35     }
36 };

这个思路确定后,我其实还写了很久,主要是

  1. 许多思路细节没有弄清楚:比如怎么更新min。
  2. 然后一些特殊情况没有仔细考虑:比如第29行。
  3. 往往语法不会错的,要注意新增一些代码是否改变了执行逻辑。

别急着动笔,不然调试也会耗很多时间。

 

posted @ 2021-09-18 18:13  曾格  阅读(51)  评论(0编辑  收藏  举报
Live2D