快手一面的第三个算法题:
方法一:通过一个辅助栈实现在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 };
这个思路确定后,我其实还写了很久,主要是
- 许多思路细节没有弄清楚:比如怎么更新min。
- 然后一些特殊情况没有仔细考虑:比如第29行。
- 往往语法不会错的,要注意新增一些代码是否改变了执行逻辑。
别急着动笔,不然调试也会耗很多时间。