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. 往往语法不会错的,要注意新增一些代码是否改变了执行逻辑。

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

    心之所愿,永不相忘
  • 相关阅读:
    loj 6035 「雅礼集训 2017 Day4」洗衣服
    BZOJ 3251 树上三角形
    UwrhrQNgRh
    百度之星2018资格赛1002题解
    [CF-676B]PYRAMID OF GLASSES
    【CF-371C】Hamburgers
    洛谷P1012拼数——字符串排序
    位运算详解及应用
    NOIP 2014 Day2 T1 无线网络发射器
    写代码要注意的几点(2)
  • 原文地址:https://www.cnblogs.com/zgll/p/15309792.html
Copyright © 2011-2022 走看看