zoukankan      html  css  js  c++  java
  • 快手一面: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. 往往语法不会错的,要注意新增一些代码是否改变了执行逻辑。

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

    心之所愿,永不相忘
  • 相关阅读:
    第四周学习总结
    第十三周编程总结
    2018秋季第十三周助教总结
    第十三周学习总结
    使用函数输出水仙花数 (void的用法)
    ZOJ3229 有源汇上下界最大流
    codeforces-1176 (div3)
    codeforces-1077 (div3)
    牛客假日团队赛1 题解
    牛客练习赛38 离线 启发式合并并查集
  • 原文地址:https://www.cnblogs.com/zgll/p/15309792.html
Copyright © 2011-2022 走看看